From 92503075a61bf5c3c05d99e4ad214600f708e215 Mon Sep 17 00:00:00 2001 From: LexLuthr <88259624+LexLuthr@users.noreply.github.com> Date: Thu, 22 Feb 2024 22:37:47 +0400 Subject: [PATCH] feat: api: new verified registry methods to get all allocations and claims (#11631) * new verireg methods * update changelog and add itest * update itest and cli * update new method's support till v9 * remove gateway APIs * fix cli internal var names --- CHANGELOG.md | 35 ++- api/api_full.go | 4 + api/mocks/mock_full.go | 30 ++ api/proxy_gen.go | 26 ++ api/v0api/full.go | 4 + api/v0api/proxy_gen.go | 26 ++ api/v0api/v0mocks/mock_full.go | 30 ++ build/openrpc/full.json.gz | Bin 35035 -> 35157 bytes build/openrpc/gateway.json.gz | Bin 11922 -> 11916 bytes build/openrpc/miner.json.gz | Bin 16478 -> 16482 bytes build/openrpc/worker.json.gz | Bin 6050 -> 6049 bytes .../actors/builtin/verifreg/actor.go.template | 2 + .../actors/builtin/verifreg/state.go.template | 31 ++ chain/actors/builtin/verifreg/v0.go | 12 + chain/actors/builtin/verifreg/v10.go | 26 ++ chain/actors/builtin/verifreg/v11.go | 26 ++ chain/actors/builtin/verifreg/v12.go | 26 ++ chain/actors/builtin/verifreg/v13.go | 26 ++ chain/actors/builtin/verifreg/v2.go | 12 + chain/actors/builtin/verifreg/v3.go | 12 + chain/actors/builtin/verifreg/v4.go | 12 + chain/actors/builtin/verifreg/v5.go | 12 + chain/actors/builtin/verifreg/v6.go | 12 + chain/actors/builtin/verifreg/v7.go | 12 + chain/actors/builtin/verifreg/v8.go | 12 + chain/actors/builtin/verifreg/v9.go | 26 ++ chain/actors/builtin/verifreg/verifreg.go | 2 + cli/filplus.go | 265 +++++++++++++----- cli/util.go | 12 + documentation/en/api-v0-methods.md | 46 +++ documentation/en/api-v1-unstable-methods.md | 46 +++ documentation/en/cli-lotus.md | 9 +- itests/verifreg_test.go | 149 ++++++++++ node/impl/full/state.go | 38 +++ 34 files changed, 906 insertions(+), 75 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88ccfa97101..3b1c8cb847d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,9 +47,42 @@ Replace the `CodeCid` field in the message trace (added in 1.23.4) with an `Invo "Subcalls": [], } ``` - This means the trace now contains an accurate "snapshot" of the actor at the time of the call, information that may not be present in the final state-tree (e.g., due to reverts). This will hopefully improve the performance and accuracy of indexing services. +### Lotus API +2 new methods have benn added to the Lotus API called `GetAllAllocations` and `GetAllClaims` which lists all the available allocations and claims available in the actor state. + +### Lotus CLI +The `filplus` commands used for listing allocations and claims have been updated. If no argument is provided to the either command, they will list out all the allocations and claims in the verified registry actor. +The output list columns have been modified to `AllocationID` and `ClaimID` instead of ID. + +```shell +lotus filplus list-allocations --help +NAME: + lotus filplus list-allocations - List allocations available in verified registry actor or made by a client if specified + +USAGE: + lotus filplus list-allocations [command options] clientAddress + +OPTIONS: + --expired list only expired allocations (default: false) + --json output results in json format (default: false) + --help, -h show help + + +lotus filplus list-claims --help +NAME: + lotus filplus list-claims - List claims available in verified registry actor or made by provider if specified + +USAGE: + lotus filplus list-claims [command options] providerAddress + +OPTIONS: + --expired list only expired claims (default: false) + --help, -h show help +``` + + # v1.25.2 / 2024-01-11 This is an optional but **highly recommended feature release** of Lotus, as it includes fixes for synchronizations issues that users have experienced. The feature release also introduces `Lotus-Provider` in its alpha testing phase, as well as the ability to call external PC2-binaries during the sealing process. diff --git a/api/api_full.go b/api/api_full.go index dc219718d0b..1cfa8d05e74 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -559,10 +559,14 @@ type FullNode interface { StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationId verifregtypes.AllocationId, tsk types.TipSetKey) (*verifregtypes.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[verifregtypes.AllocationId]verifregtypes.Allocation, error) //perm:read + // StateGetAllAllocations returns the all the allocations available in verified registry actor. + StateGetAllAllocations(ctx context.Context, tsk types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) //perm:read // StateGetClaim returns the claim for a given address and claim ID. StateGetClaim(ctx context.Context, providerAddr address.Address, claimId verifregtypes.ClaimId, tsk types.TipSetKey) (*verifregtypes.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[verifregtypes.ClaimId]verifregtypes.Claim, error) //perm:read + // StateGetAllClaims returns the all the claims available in verified registry actor. + StateGetAllClaims(ctx context.Context, tsk types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.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 // StateLookupID retrieves the ID address of the given address diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index d141123e025..5a5bb9c92d9 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -3188,6 +3188,36 @@ func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{}) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2) } +// StateGetAllAllocations mocks base method. +func (m *MockFullNode) StateGetAllAllocations(arg0 context.Context, arg1 types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetAllAllocations", arg0, arg1) + ret0, _ := ret[0].(map[verifreg.AllocationId]verifreg.Allocation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetAllAllocations indicates an expected call of StateGetAllAllocations. +func (mr *MockFullNodeMockRecorder) StateGetAllAllocations(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllAllocations", reflect.TypeOf((*MockFullNode)(nil).StateGetAllAllocations), arg0, arg1) +} + +// StateGetAllClaims mocks base method. +func (m *MockFullNode) StateGetAllClaims(arg0 context.Context, arg1 types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetAllClaims", arg0, arg1) + ret0, _ := ret[0].(map[verifreg.ClaimId]verifreg.Claim) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetAllClaims indicates an expected call of StateGetAllClaims. +func (mr *MockFullNodeMockRecorder) StateGetAllClaims(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllClaims", reflect.TypeOf((*MockFullNode)(nil).StateGetAllClaims), arg0, arg1) +} + // StateGetAllocation mocks base method. func (m *MockFullNode) StateGetAllocation(arg0 context.Context, arg1 address.Address, arg2 verifreg.AllocationId, arg3 types.TipSetKey) (*verifreg.Allocation, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index d89082b6294..e4db0fb93d1 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -485,6 +485,10 @@ type FullNodeMethods struct { StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` + StateGetAllAllocations func(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) `perm:"read"` + + StateGetAllClaims func(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) `perm:"read"` + StateGetAllocation func(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"` StateGetAllocationForPendingDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"` @@ -3405,6 +3409,28 @@ func (s *FullNodeStub) StateGetActor(p0 context.Context, p1 address.Address, p2 return nil, ErrNotSupported } +func (s *FullNodeStruct) StateGetAllAllocations(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) { + if s.Internal.StateGetAllAllocations == nil { + return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported + } + return s.Internal.StateGetAllAllocations(p0, p1) +} + +func (s *FullNodeStub) StateGetAllAllocations(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) { + return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported +} + +func (s *FullNodeStruct) StateGetAllClaims(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) { + if s.Internal.StateGetAllClaims == nil { + return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported + } + return s.Internal.StateGetAllClaims(p0, p1) +} + +func (s *FullNodeStub) StateGetAllClaims(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) { + return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported +} + func (s *FullNodeStruct) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) { if s.Internal.StateGetAllocation == nil { return nil, ErrNotSupported diff --git a/api/v0api/full.go b/api/v0api/full.go index d92d5a95c8e..db84ddc8745 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -537,10 +537,14 @@ type FullNode interface { StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationId verifregtypes.AllocationId, tsk types.TipSetKey) (*verifregtypes.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[verifregtypes.AllocationId]verifregtypes.Allocation, error) //perm:read + // StateGetAllAllocations returns the all the allocations available in verified registry actor. + StateGetAllAllocations(ctx context.Context, tsk types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) //perm:read // StateGetClaim returns the claim for a given address and claim ID. StateGetClaim(ctx context.Context, providerAddr address.Address, claimId verifregtypes.ClaimId, tsk types.TipSetKey) (*verifregtypes.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[verifregtypes.ClaimId]verifregtypes.Claim, error) //perm:read + // StateGetAllClaims returns the all the claims available in verified registry actor. + StateGetAllClaims(ctx context.Context, tsk types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) //perm:read // StateLookupID retrieves the ID address of the given address StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read // StateAccountKey returns the public key address of the given ID address diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index bd37f64298d..90c25d4a774 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -280,6 +280,10 @@ type FullNodeMethods struct { StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` + StateGetAllAllocations func(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) `perm:"read"` + + StateGetAllClaims func(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) `perm:"read"` + StateGetAllocation func(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"` StateGetAllocationForPendingDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"` @@ -1837,6 +1841,28 @@ func (s *FullNodeStub) StateGetActor(p0 context.Context, p1 address.Address, p2 return nil, ErrNotSupported } +func (s *FullNodeStruct) StateGetAllAllocations(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) { + if s.Internal.StateGetAllAllocations == nil { + return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported + } + return s.Internal.StateGetAllAllocations(p0, p1) +} + +func (s *FullNodeStub) StateGetAllAllocations(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) { + return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported +} + +func (s *FullNodeStruct) StateGetAllClaims(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) { + if s.Internal.StateGetAllClaims == nil { + return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported + } + return s.Internal.StateGetAllClaims(p0, p1) +} + +func (s *FullNodeStub) StateGetAllClaims(p0 context.Context, p1 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) { + return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported +} + func (s *FullNodeStruct) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) { if s.Internal.StateGetAllocation == nil { return nil, ErrNotSupported diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 7a722ed257c..6b70e0e49f8 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -2338,6 +2338,36 @@ func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{}) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2) } +// StateGetAllAllocations mocks base method. +func (m *MockFullNode) StateGetAllAllocations(arg0 context.Context, arg1 types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetAllAllocations", arg0, arg1) + ret0, _ := ret[0].(map[verifreg.AllocationId]verifreg.Allocation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetAllAllocations indicates an expected call of StateGetAllAllocations. +func (mr *MockFullNodeMockRecorder) StateGetAllAllocations(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllAllocations", reflect.TypeOf((*MockFullNode)(nil).StateGetAllAllocations), arg0, arg1) +} + +// StateGetAllClaims mocks base method. +func (m *MockFullNode) StateGetAllClaims(arg0 context.Context, arg1 types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetAllClaims", arg0, arg1) + ret0, _ := ret[0].(map[verifreg.ClaimId]verifreg.Claim) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetAllClaims indicates an expected call of StateGetAllClaims. +func (mr *MockFullNodeMockRecorder) StateGetAllClaims(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllClaims", reflect.TypeOf((*MockFullNode)(nil).StateGetAllClaims), arg0, arg1) +} + // StateGetAllocation mocks base method. func (m *MockFullNode) StateGetAllocation(arg0 context.Context, arg1 address.Address, arg2 verifreg.AllocationId, arg3 types.TipSetKey) (*verifreg.Allocation, error) { m.ctrl.T.Helper() diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 3829a7f34b1b207b6cf943dc9b09c4c39a0a9283..1120e15f258405ee24852391827c0392068fb38f 100644 GIT binary patch literal 35157 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Ðaie^%Nr|LR2o7PY$GRPNAY~b3*Y=}#5 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 U`uXes2LJ&7|041058f3A0N>qPfdBvi literal 35035 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 6571430bcc4533d2bb8a5cb8cbf0525c1047254f..c69b25f1e3c06d1bb4766caf7b546dfca2695c73 100644 GIT binary patch delta 9165 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 delta 9205 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 Skwrp!dGR{bzH&E0M*2U$a@JV@ literal 6050 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 diff --git a/chain/actors/builtin/verifreg/actor.go.template b/chain/actors/builtin/verifreg/actor.go.template index 991c6717bd7..f4467d979bf 100644 --- a/chain/actors/builtin/verifreg/actor.go.template +++ b/chain/actors/builtin/verifreg/actor.go.template @@ -81,8 +81,10 @@ type State interface { ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error GetAllocation(clientIdAddr address.Address, allocationId AllocationId) (*Allocation, bool, error) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) + GetAllAllocations() (map[AllocationId]Allocation, error) GetClaim(providerIdAddr address.Address, claimId ClaimId) (*Claim, bool, error) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) + GetAllClaims() (map[ClaimId]Claim, error) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) GetState() interface{} } diff --git a/chain/actors/builtin/verifreg/state.go.template b/chain/actors/builtin/verifreg/state.go.template index adcbc22c2e4..7835b16b640 100644 --- a/chain/actors/builtin/verifreg/state.go.template +++ b/chain/actors/builtin/verifreg/state.go.template @@ -145,6 +145,21 @@ func (s *state{{.v}}) GetAllocations(clientIdAddr address.Address) (map[Allocati {{end}} } +func (s *state{{.v}}) GetAllAllocations() (map[AllocationId]Allocation, error) { +{{if (le .v 8)}} + return nil, xerrors.Errorf("unsupported in actors v{{.v}}") +{{else}} + v{{.v}}Map, err := s.State.GetAllAllocations(s.store) + + retMap := make(map[AllocationId]Allocation, len(v{{.v}}Map)) + for k, v := range v{{.v}}Map { + retMap[AllocationId(k)] = Allocation(v) + } + + return retMap, err +{{end}} +} + func (s *state{{.v}}) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { {{if (le .v 8)}} return nil, false, xerrors.Errorf("unsupported in actors v{{.v}}") @@ -170,6 +185,22 @@ func (s *state{{.v}}) GetClaims(providerIdAddr address.Address) (map[ClaimId]Cla {{end}} } +func (s *state{{.v}}) GetAllClaims() (map[ClaimId]Claim, error) { +{{if (le .v 8)}} + return nil, xerrors.Errorf("unsupported in actors v{{.v}}") +{{else}} + v{{.v}}Map, err := s.State.GetAllClaims(s.store) + + retMap := make(map[ClaimId]Claim, len(v{{.v}}Map)) + for k, v := range v{{.v}}Map { + retMap[ClaimId(k)] = Claim(v) + } + + return retMap, err + +{{end}} +} + func (s *state{{.v}}) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { {{if (le .v 8)}} return nil, xerrors.Errorf("unsupported in actors v{{.v}}") diff --git a/chain/actors/builtin/verifreg/v0.go b/chain/actors/builtin/verifreg/v0.go index 9913c42c0c6..4129e7a2dae 100644 --- a/chain/actors/builtin/verifreg/v0.go +++ b/chain/actors/builtin/verifreg/v0.go @@ -106,6 +106,12 @@ func (s *state0) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state0) GetAllAllocations() (map[AllocationId]Allocation, error) { + + return nil, xerrors.Errorf("unsupported in actors v0") + +} + func (s *state0) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { return nil, false, xerrors.Errorf("unsupported in actors v0") @@ -118,6 +124,12 @@ func (s *state0) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state0) GetAllClaims() (map[ClaimId]Claim, error) { + + return nil, xerrors.Errorf("unsupported in actors v0") + +} + func (s *state0) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { return nil, xerrors.Errorf("unsupported in actors v0") diff --git a/chain/actors/builtin/verifreg/v10.go b/chain/actors/builtin/verifreg/v10.go index 256f4d2f888..85f85c7f2c9 100644 --- a/chain/actors/builtin/verifreg/v10.go +++ b/chain/actors/builtin/verifreg/v10.go @@ -114,6 +114,19 @@ func (s *state10) GetAllocations(clientIdAddr address.Address) (map[AllocationId } +func (s *state10) GetAllAllocations() (map[AllocationId]Allocation, error) { + + v10Map, err := s.State.GetAllAllocations(s.store) + + retMap := make(map[AllocationId]Allocation, len(v10Map)) + for k, v := range v10Map { + retMap[AllocationId(k)] = Allocation(v) + } + + return retMap, err + +} + func (s *state10) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg10.ClaimId(claimId)) @@ -134,6 +147,19 @@ func (s *state10) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, } +func (s *state10) GetAllClaims() (map[ClaimId]Claim, error) { + + v10Map, err := s.State.GetAllClaims(s.store) + + retMap := make(map[ClaimId]Claim, len(v10Map)) + for k, v := range v10Map { + retMap[ClaimId(k)] = Claim(v) + } + + return retMap, err + +} + func (s *state10) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { v10Map, err := s.LoadClaimsToMap(s.store, providerIdAddr) diff --git a/chain/actors/builtin/verifreg/v11.go b/chain/actors/builtin/verifreg/v11.go index 7b7b9e4c0a8..5a8e1cb0cc8 100644 --- a/chain/actors/builtin/verifreg/v11.go +++ b/chain/actors/builtin/verifreg/v11.go @@ -114,6 +114,19 @@ func (s *state11) GetAllocations(clientIdAddr address.Address) (map[AllocationId } +func (s *state11) GetAllAllocations() (map[AllocationId]Allocation, error) { + + v11Map, err := s.State.GetAllAllocations(s.store) + + retMap := make(map[AllocationId]Allocation, len(v11Map)) + for k, v := range v11Map { + retMap[AllocationId(k)] = Allocation(v) + } + + return retMap, err + +} + func (s *state11) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg11.ClaimId(claimId)) @@ -134,6 +147,19 @@ func (s *state11) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, } +func (s *state11) GetAllClaims() (map[ClaimId]Claim, error) { + + v11Map, err := s.State.GetAllClaims(s.store) + + retMap := make(map[ClaimId]Claim, len(v11Map)) + for k, v := range v11Map { + retMap[ClaimId(k)] = Claim(v) + } + + return retMap, err + +} + func (s *state11) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { v11Map, err := s.LoadClaimsToMap(s.store, providerIdAddr) diff --git a/chain/actors/builtin/verifreg/v12.go b/chain/actors/builtin/verifreg/v12.go index 77a113fbe86..7c9a493f169 100644 --- a/chain/actors/builtin/verifreg/v12.go +++ b/chain/actors/builtin/verifreg/v12.go @@ -114,6 +114,19 @@ func (s *state12) GetAllocations(clientIdAddr address.Address) (map[AllocationId } +func (s *state12) GetAllAllocations() (map[AllocationId]Allocation, error) { + + v12Map, err := s.State.GetAllAllocations(s.store) + + retMap := make(map[AllocationId]Allocation, len(v12Map)) + for k, v := range v12Map { + retMap[AllocationId(k)] = Allocation(v) + } + + return retMap, err + +} + func (s *state12) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg12.ClaimId(claimId)) @@ -134,6 +147,19 @@ func (s *state12) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, } +func (s *state12) GetAllClaims() (map[ClaimId]Claim, error) { + + v12Map, err := s.State.GetAllClaims(s.store) + + retMap := make(map[ClaimId]Claim, len(v12Map)) + for k, v := range v12Map { + retMap[ClaimId(k)] = Claim(v) + } + + return retMap, err + +} + func (s *state12) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { v12Map, err := s.LoadClaimsToMap(s.store, providerIdAddr) diff --git a/chain/actors/builtin/verifreg/v13.go b/chain/actors/builtin/verifreg/v13.go index 977f2213735..0c487a2f7e0 100644 --- a/chain/actors/builtin/verifreg/v13.go +++ b/chain/actors/builtin/verifreg/v13.go @@ -114,6 +114,19 @@ func (s *state13) GetAllocations(clientIdAddr address.Address) (map[AllocationId } +func (s *state13) GetAllAllocations() (map[AllocationId]Allocation, error) { + + v13Map, err := s.State.GetAllAllocations(s.store) + + retMap := make(map[AllocationId]Allocation, len(v13Map)) + for k, v := range v13Map { + retMap[AllocationId(k)] = Allocation(v) + } + + return retMap, err + +} + func (s *state13) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg13.ClaimId(claimId)) @@ -134,6 +147,19 @@ func (s *state13) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, } +func (s *state13) GetAllClaims() (map[ClaimId]Claim, error) { + + v13Map, err := s.State.GetAllClaims(s.store) + + retMap := make(map[ClaimId]Claim, len(v13Map)) + for k, v := range v13Map { + retMap[ClaimId(k)] = Claim(v) + } + + return retMap, err + +} + func (s *state13) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { v13Map, err := s.LoadClaimsToMap(s.store, providerIdAddr) diff --git a/chain/actors/builtin/verifreg/v2.go b/chain/actors/builtin/verifreg/v2.go index 31f7f775df2..7f71639e668 100644 --- a/chain/actors/builtin/verifreg/v2.go +++ b/chain/actors/builtin/verifreg/v2.go @@ -106,6 +106,12 @@ func (s *state2) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state2) GetAllAllocations() (map[AllocationId]Allocation, error) { + + return nil, xerrors.Errorf("unsupported in actors v2") + +} + func (s *state2) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { return nil, false, xerrors.Errorf("unsupported in actors v2") @@ -118,6 +124,12 @@ func (s *state2) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state2) GetAllClaims() (map[ClaimId]Claim, error) { + + return nil, xerrors.Errorf("unsupported in actors v2") + +} + func (s *state2) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { return nil, xerrors.Errorf("unsupported in actors v2") diff --git a/chain/actors/builtin/verifreg/v3.go b/chain/actors/builtin/verifreg/v3.go index 3ea016fd5c3..3e8ea9a1f7a 100644 --- a/chain/actors/builtin/verifreg/v3.go +++ b/chain/actors/builtin/verifreg/v3.go @@ -107,6 +107,12 @@ func (s *state3) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state3) GetAllAllocations() (map[AllocationId]Allocation, error) { + + return nil, xerrors.Errorf("unsupported in actors v3") + +} + func (s *state3) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { return nil, false, xerrors.Errorf("unsupported in actors v3") @@ -119,6 +125,12 @@ func (s *state3) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state3) GetAllClaims() (map[ClaimId]Claim, error) { + + return nil, xerrors.Errorf("unsupported in actors v3") + +} + func (s *state3) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { return nil, xerrors.Errorf("unsupported in actors v3") diff --git a/chain/actors/builtin/verifreg/v4.go b/chain/actors/builtin/verifreg/v4.go index 464cc9fdc20..1dc43886422 100644 --- a/chain/actors/builtin/verifreg/v4.go +++ b/chain/actors/builtin/verifreg/v4.go @@ -107,6 +107,12 @@ func (s *state4) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state4) GetAllAllocations() (map[AllocationId]Allocation, error) { + + return nil, xerrors.Errorf("unsupported in actors v4") + +} + func (s *state4) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { return nil, false, xerrors.Errorf("unsupported in actors v4") @@ -119,6 +125,12 @@ func (s *state4) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state4) GetAllClaims() (map[ClaimId]Claim, error) { + + return nil, xerrors.Errorf("unsupported in actors v4") + +} + func (s *state4) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { return nil, xerrors.Errorf("unsupported in actors v4") diff --git a/chain/actors/builtin/verifreg/v5.go b/chain/actors/builtin/verifreg/v5.go index 17901dd23a9..a7505330c26 100644 --- a/chain/actors/builtin/verifreg/v5.go +++ b/chain/actors/builtin/verifreg/v5.go @@ -107,6 +107,12 @@ func (s *state5) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state5) GetAllAllocations() (map[AllocationId]Allocation, error) { + + return nil, xerrors.Errorf("unsupported in actors v5") + +} + func (s *state5) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { return nil, false, xerrors.Errorf("unsupported in actors v5") @@ -119,6 +125,12 @@ func (s *state5) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state5) GetAllClaims() (map[ClaimId]Claim, error) { + + return nil, xerrors.Errorf("unsupported in actors v5") + +} + func (s *state5) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { return nil, xerrors.Errorf("unsupported in actors v5") diff --git a/chain/actors/builtin/verifreg/v6.go b/chain/actors/builtin/verifreg/v6.go index 68fac64cb4d..93424152e4b 100644 --- a/chain/actors/builtin/verifreg/v6.go +++ b/chain/actors/builtin/verifreg/v6.go @@ -107,6 +107,12 @@ func (s *state6) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state6) GetAllAllocations() (map[AllocationId]Allocation, error) { + + return nil, xerrors.Errorf("unsupported in actors v6") + +} + func (s *state6) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { return nil, false, xerrors.Errorf("unsupported in actors v6") @@ -119,6 +125,12 @@ func (s *state6) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state6) GetAllClaims() (map[ClaimId]Claim, error) { + + return nil, xerrors.Errorf("unsupported in actors v6") + +} + func (s *state6) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { return nil, xerrors.Errorf("unsupported in actors v6") diff --git a/chain/actors/builtin/verifreg/v7.go b/chain/actors/builtin/verifreg/v7.go index e8f3ac73984..bd67aee5ff6 100644 --- a/chain/actors/builtin/verifreg/v7.go +++ b/chain/actors/builtin/verifreg/v7.go @@ -106,6 +106,12 @@ func (s *state7) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state7) GetAllAllocations() (map[AllocationId]Allocation, error) { + + return nil, xerrors.Errorf("unsupported in actors v7") + +} + func (s *state7) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { return nil, false, xerrors.Errorf("unsupported in actors v7") @@ -118,6 +124,12 @@ func (s *state7) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state7) GetAllClaims() (map[ClaimId]Claim, error) { + + return nil, xerrors.Errorf("unsupported in actors v7") + +} + func (s *state7) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { return nil, xerrors.Errorf("unsupported in actors v7") diff --git a/chain/actors/builtin/verifreg/v8.go b/chain/actors/builtin/verifreg/v8.go index 89393c4d9cf..1515c1c5bd3 100644 --- a/chain/actors/builtin/verifreg/v8.go +++ b/chain/actors/builtin/verifreg/v8.go @@ -106,6 +106,12 @@ func (s *state8) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state8) GetAllAllocations() (map[AllocationId]Allocation, error) { + + return nil, xerrors.Errorf("unsupported in actors v8") + +} + func (s *state8) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { return nil, false, xerrors.Errorf("unsupported in actors v8") @@ -118,6 +124,12 @@ func (s *state8) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state8) GetAllClaims() (map[ClaimId]Claim, error) { + + return nil, xerrors.Errorf("unsupported in actors v8") + +} + func (s *state8) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { return nil, xerrors.Errorf("unsupported in actors v8") diff --git a/chain/actors/builtin/verifreg/v9.go b/chain/actors/builtin/verifreg/v9.go index ce63c7f94b4..41422615bcc 100644 --- a/chain/actors/builtin/verifreg/v9.go +++ b/chain/actors/builtin/verifreg/v9.go @@ -113,6 +113,19 @@ func (s *state9) GetAllocations(clientIdAddr address.Address) (map[AllocationId] } +func (s *state9) GetAllAllocations() (map[AllocationId]Allocation, error) { + + v9Map, err := s.State.GetAllAllocations(s.store) + + retMap := make(map[AllocationId]Allocation, len(v9Map)) + for k, v := range v9Map { + retMap[AllocationId(k)] = Allocation(v) + } + + return retMap, err + +} + func (s *state9) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) { claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg9.ClaimId(claimId)) @@ -133,6 +146,19 @@ func (s *state9) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, e } +func (s *state9) GetAllClaims() (map[ClaimId]Claim, error) { + + v9Map, err := s.State.GetAllClaims(s.store) + + retMap := make(map[ClaimId]Claim, len(v9Map)) + for k, v := range v9Map { + retMap[ClaimId(k)] = Claim(v) + } + + return retMap, err + +} + func (s *state9) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) { v9Map, err := s.LoadClaimsToMap(s.store, providerIdAddr) diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index 4c1e66eb59b..2d66d90282d 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -147,8 +147,10 @@ type State interface { ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error GetAllocation(clientIdAddr address.Address, allocationId AllocationId) (*Allocation, bool, error) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) + GetAllAllocations() (map[AllocationId]Allocation, error) GetClaim(providerIdAddr address.Address, claimId ClaimId) (*Claim, bool, error) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) + GetAllClaims() (map[ClaimId]Claim, error) GetClaimIdsBySector(providerIdAddr address.Address) (map[abi.SectorNumber][]ClaimId, error) GetState() interface{} } diff --git a/cli/filplus.go b/cli/filplus.go index 9fbd2a489ad..e86fe0372c3 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -7,6 +7,7 @@ import ( "fmt" "os" "strconv" + "strings" cbor "github.com/ipfs/go-ipld-cbor" "github.com/urfave/cli/v2" @@ -233,16 +234,21 @@ var filplusListClientsCmd = &cli.Command{ var filplusListAllocationsCmd = &cli.Command{ Name: "list-allocations", - Usage: "List allocations made by client", + Usage: "List allocations available in verified registry actor or made by a client if specified", ArgsUsage: "clientAddress", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "expired", Usage: "list only expired allocations", }, + &cli.BoolFlag{ + Name: "json", + Usage: "output results in json format", + Value: false, + }, }, Action: func(cctx *cli.Context) error { - if cctx.NArg() != 1 { + if cctx.NArg() > 1 { return IncorrectNumArgs(cctx) } @@ -253,14 +259,76 @@ var filplusListAllocationsCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - clientAddr, err := address.NewFromString(cctx.Args().Get(0)) - if err != nil { - return err - } + writeOut := func(tsHeight abi.ChainEpoch, allocations map[verifreg.AllocationId]verifreg.Allocation, json, expired bool) error { + // Map Keys. Corresponds to the standard tablewriter output + allocationID := "AllocationID" + client := "Client" + provider := "Miner" + pieceCid := "PieceCid" + pieceSize := "PieceSize" + tMin := "TermMin" + tMax := "TermMax" + expr := "Expiration" + + // One-to-one mapping between tablewriter keys and JSON keys + tableKeysToJsonKeys := map[string]string{ + allocationID: strings.ToLower(allocationID), + client: strings.ToLower(client), + provider: strings.ToLower(provider), + pieceCid: strings.ToLower(pieceCid), + pieceSize: strings.ToLower(pieceSize), + tMin: strings.ToLower(tMin), + tMax: strings.ToLower(tMax), + expr: strings.ToLower(expr), + } - clientIdAddr, err := api.StateLookupID(ctx, clientAddr, types.EmptyTSK) - if err != nil { - return err + var allocs []map[string]interface{} + + for key, val := range allocations { + if tsHeight > val.Expiration || !expired { + alloc := map[string]interface{}{ + allocationID: key, + client: val.Client, + provider: val.Provider, + pieceCid: val.Data, + pieceSize: val.Size, + tMin: val.TermMin, + tMax: val.TermMax, + expr: val.Expiration, + } + allocs = append(allocs, alloc) + } + } + + if json { + // get a new list of allocations with json keys instead of tablewriter keys + var jsonAllocs []map[string]interface{} + for _, alloc := range allocs { + jsonAlloc := make(map[string]interface{}) + for k, v := range alloc { + jsonAlloc[tableKeysToJsonKeys[k]] = v + } + jsonAllocs = append(jsonAllocs, jsonAlloc) + } + // then return this! + return PrintJson(jsonAllocs) + } + // Init the tablewriter's columns + tw := tablewriter.New( + tablewriter.Col(allocationID), + tablewriter.Col(client), + tablewriter.Col(provider), + tablewriter.Col(pieceCid), + tablewriter.Col(pieceSize), + tablewriter.Col(tMin), + tablewriter.Col(tMax), + tablewriter.NewLineCol(expr)) + // populate it with content + for _, alloc := range allocs { + tw.Write(alloc) + } + // return the corresponding string + return tw.Flush(os.Stdout) } store := adt.WrapStore(ctx, cbor.NewCborStore(blockstore.NewAPIBlockstore(api))) @@ -280,41 +348,38 @@ var filplusListAllocationsCmd = &cli.Command{ return err } - allocationsMap, err := verifregState.GetAllocations(clientIdAddr) + if cctx.NArg() == 1 { + clientAddr, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return err + } + + clientIdAddr, err := api.StateLookupID(ctx, clientAddr, types.EmptyTSK) + if err != nil { + return err + } + + allocationsMap, err := verifregState.GetAllocations(clientIdAddr) + if err != nil { + return err + } + + return writeOut(ts.Height(), allocationsMap, cctx.Bool("json"), cctx.Bool("expired")) + } + + allocationsMap, err := verifregState.GetAllAllocations() if err != nil { return err } - tw := tablewriter.New( - tablewriter.Col("ID"), - tablewriter.Col("Provider"), - tablewriter.Col("Data"), - tablewriter.Col("Size"), - tablewriter.Col("TermMin"), - tablewriter.Col("TermMax"), - tablewriter.Col("Expiration"), - ) + return writeOut(ts.Height(), allocationsMap, cctx.Bool("json"), cctx.Bool("expired")) - for allocationId, allocation := range allocationsMap { - if ts.Height() > allocation.Expiration || !cctx.IsSet("expired") { - tw.Write(map[string]interface{}{ - "ID": allocationId, - "Provider": allocation.Provider, - "Data": allocation.Data, - "Size": allocation.Size, - "TermMin": allocation.TermMin, - "TermMax": allocation.TermMax, - "Expiration": allocation.Expiration, - }) - } - } - return tw.Flush(os.Stdout) }, } var filplusListClaimsCmd = &cli.Command{ Name: "list-claims", - Usage: "List claims made by provider", + Usage: "List claims available in verified registry actor or made by provider if specified", ArgsUsage: "providerAddress", Flags: []cli.Flag{ &cli.BoolFlag{ @@ -323,7 +388,7 @@ var filplusListClaimsCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.NArg() != 1 { + if cctx.NArg() > 1 { return IncorrectNumArgs(cctx) } @@ -334,14 +399,81 @@ var filplusListClaimsCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - providerAddr, err := address.NewFromString(cctx.Args().Get(0)) - if err != nil { - return err - } + writeOut := func(tsHeight abi.ChainEpoch, claims map[verifreg.ClaimId]verifreg.Claim, json, expired bool) error { + // Map Keys. Corresponds to the standard tablewriter output + claimID := "ClaimID" + provider := "Provider" + client := "Client" + data := "Data" + size := "Size" + tMin := "TermMin" + tMax := "TermMax" + tStart := "TermStart" + sector := "Sector" + + // One-to-one mapping between tablewriter keys and JSON keys + tableKeysToJsonKeys := map[string]string{ + claimID: strings.ToLower(claimID), + provider: strings.ToLower(provider), + client: strings.ToLower(client), + data: strings.ToLower(data), + size: strings.ToLower(size), + tMin: strings.ToLower(tMin), + tMax: strings.ToLower(tMax), + tStart: strings.ToLower(tStart), + sector: strings.ToLower(sector), + } - providerIdAddr, err := api.StateLookupID(ctx, providerAddr, types.EmptyTSK) - if err != nil { - return err + var claimList []map[string]interface{} + + for key, val := range claims { + if tsHeight > val.TermMax || !expired { + claim := map[string]interface{}{ + claimID: key, + provider: val.Provider, + client: val.Client, + data: val.Data, + size: val.Size, + tMin: val.TermMin, + tMax: val.TermMax, + tStart: val.TermStart, + sector: val.Sector, + } + claimList = append(claimList, claim) + } + } + + if json { + // get a new list of claims with json keys instead of tablewriter keys + var jsonClaims []map[string]interface{} + for _, claim := range claimList { + jsonClaim := make(map[string]interface{}) + for k, v := range claim { + jsonClaim[tableKeysToJsonKeys[k]] = v + } + jsonClaims = append(jsonClaims, jsonClaim) + } + // then return this! + return PrintJson(jsonClaims) + } + // Init the tablewriter's columns + tw := tablewriter.New( + tablewriter.Col(claimID), + tablewriter.Col(client), + tablewriter.Col(provider), + tablewriter.Col(data), + tablewriter.Col(size), + tablewriter.Col(tMin), + tablewriter.Col(tMax), + tablewriter.Col(tStart), + tablewriter.NewLineCol(sector)) + // populate it with content + for _, alloc := range claimList { + + tw.Write(alloc) + } + // return the corresponding string + return tw.Flush(os.Stdout) } store := adt.WrapStore(ctx, cbor.NewCborStore(blockstore.NewAPIBlockstore(api))) @@ -361,39 +493,32 @@ var filplusListClaimsCmd = &cli.Command{ return err } - claimsMap, err := verifregState.GetClaims(providerIdAddr) + if cctx.NArg() == 1 { + providerAddr, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return err + } + + providerIdAddr, err := api.StateLookupID(ctx, providerAddr, types.EmptyTSK) + if err != nil { + return err + } + + claimsMap, err := verifregState.GetClaims(providerIdAddr) + if err != nil { + return err + } + + return writeOut(ts.Height(), claimsMap, cctx.Bool("json"), cctx.Bool("expired")) + } + + claimsMap, err := verifregState.GetAllClaims() if err != nil { return err } - tw := tablewriter.New( - tablewriter.Col("ID"), - tablewriter.Col("Provider"), - tablewriter.Col("Client"), - tablewriter.Col("Data"), - tablewriter.Col("Size"), - tablewriter.Col("TermMin"), - tablewriter.Col("TermMax"), - tablewriter.Col("TermStart"), - tablewriter.Col("Sector"), - ) + return writeOut(ts.Height(), claimsMap, cctx.Bool("json"), cctx.Bool("expired")) - for claimId, claim := range claimsMap { - if ts.Height() > claim.TermMax || !cctx.IsSet("expired") { - tw.Write(map[string]interface{}{ - "ID": claimId, - "Provider": claim.Provider, - "Client": claim.Client, - "Data": claim.Data, - "Size": claim.Size, - "TermMin": claim.TermMin, - "TermMax": claim.TermMax, - "TermStart": claim.TermStart, - "Sector": claim.Sector, - }) - } - } - return tw.Flush(os.Stdout) }, } diff --git a/cli/util.go b/cli/util.go index 03de817f9b1..de161f59085 100644 --- a/cli/util.go +++ b/cli/util.go @@ -2,6 +2,8 @@ package cli import ( "context" + "encoding/json" + "fmt" "os" "github.com/fatih/color" @@ -37,3 +39,13 @@ func parseTipSet(ctx context.Context, api v0api.FullNode, vals []string) (*types return types.NewTipSet(headers) } + +func PrintJson(obj interface{}) error { + resJson, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return fmt.Errorf("marshalling json: %w", err) + } + + fmt.Println(string(resJson)) + return nil +} diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index e801a239098..19c3ca48195 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -170,6 +170,8 @@ * [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds) * [StateDecodeParams](#StateDecodeParams) * [StateGetActor](#StateGetActor) + * [StateGetAllAllocations](#StateGetAllAllocations) + * [StateGetAllClaims](#StateGetAllClaims) * [StateGetAllocation](#StateGetAllocation) * [StateGetAllocationForPendingDeal](#StateGetAllocationForPendingDeal) * [StateGetAllocations](#StateGetAllocations) @@ -5313,6 +5315,50 @@ Response: } ``` +### StateGetAllAllocations +StateGetAllAllocations returns the all the allocations available in verified registry actor. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + +### StateGetAllClaims +StateGetAllClaims returns the all the claims available in verified registry actor. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + ### StateGetAllocation StateGetAllocation returns the allocation for a given address and allocation ID. diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index d5349189e60..b4af70d3579 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -230,6 +230,8 @@ * [StateDecodeParams](#StateDecodeParams) * [StateEncodeParams](#StateEncodeParams) * [StateGetActor](#StateGetActor) + * [StateGetAllAllocations](#StateGetAllAllocations) + * [StateGetAllClaims](#StateGetAllClaims) * [StateGetAllocation](#StateGetAllocation) * [StateGetAllocationForPendingDeal](#StateGetAllocationForPendingDeal) * [StateGetAllocationIdForPendingDeal](#StateGetAllocationIdForPendingDeal) @@ -6892,6 +6894,50 @@ Response: } ``` +### StateGetAllAllocations +StateGetAllAllocations returns the all the allocations available in verified registry actor. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + +### StateGetAllClaims +StateGetAllClaims returns the all the claims available in verified registry actor. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + ### StateGetAllocation StateGetAllocation returns the allocation for a given address and allocation ID. diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index ff62980dc31..96f56642b13 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -1188,8 +1188,8 @@ COMMANDS: check-client-datacap check verified client remaining bytes check-notary-datacap check a notary's remaining bytes sign-remove-data-cap-proposal allows a notary to sign a Remove Data Cap Proposal - list-allocations List allocations made by client - list-claims List claims made by provider + list-allocations List allocations available in verified registry actor or made by a client if specified + list-claims List claims available in verified registry actor or made by provider if specified remove-expired-allocations remove expired allocations (if no allocations are specified all eligible allocations are removed) remove-expired-claims remove expired claims (if no claims are specified all eligible claims are removed) help, h Shows a list of commands or help for one command @@ -1275,20 +1275,21 @@ OPTIONS: ### lotus filplus list-allocations ``` NAME: - lotus filplus list-allocations - List allocations made by client + lotus filplus list-allocations - List allocations available in verified registry actor or made by a client if specified USAGE: lotus filplus list-allocations [command options] clientAddress OPTIONS: --expired list only expired allocations (default: false) + --json output results in json format (default: false) --help, -h show help ``` ### lotus filplus list-claims ``` NAME: - lotus filplus list-claims - List claims made by provider + lotus filplus list-claims - List claims available in verified registry actor or made by provider if specified USAGE: lotus filplus list-claims [command options] providerAddress diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go index ffe50c72b19..07a31477d75 100644 --- a/itests/verifreg_test.go +++ b/itests/verifreg_test.go @@ -503,3 +503,152 @@ func makeVerifier(ctx context.Context, t *testing.T, api *impl.FullNodeAPI, root require.NoError(t, err) require.Equal(t, allowance, *verifierAllowance) } + +func TestVerifiedListAllAllocationsAndClaims(t *testing.T) { + blockTime := 100 * time.Millisecond + + rootKey, err := key.GenerateKey(types.KTSecp256k1) + require.NoError(t, err) + + verifier1Key, err := key.GenerateKey(types.KTSecp256k1) + require.NoError(t, err) + + verifiedClientKey, err := key.GenerateKey(types.KTBLS) + require.NoError(t, err) + + bal, err := types.ParseFIL("100fil") + require.NoError(t, err) + + node, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), + kit.RootVerifier(rootKey, abi.NewTokenAmount(bal.Int64())), + kit.Account(verifier1Key, abi.NewTokenAmount(bal.Int64())), + kit.Account(verifiedClientKey, abi.NewTokenAmount(bal.Int64())), + ) + + ens.InterconnectAll().BeginMining(blockTime) + + api := node.FullNode.(*impl.FullNodeAPI) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // get VRH + vrh, err := api.StateVerifiedRegistryRootKey(ctx, types.TipSetKey{}) + fmt.Println(vrh.String()) + require.NoError(t, err) + + // import the root key. + rootAddr, err := api.WalletImport(ctx, &rootKey.KeyInfo) + require.NoError(t, err) + + // import the verifiers' keys. + verifier1Addr, err := api.WalletImport(ctx, &verifier1Key.KeyInfo) + require.NoError(t, err) + + // import the verified client's key. + verifiedClientAddr, err := api.WalletImport(ctx, &verifiedClientKey.KeyInfo) + require.NoError(t, err) + + // resolve all keys + + // make the 2 verifiers + + makeVerifier(ctx, t, api, rootAddr, verifier1Addr) + + // assign datacap to a client + initialDatacap := big.NewInt(20000) + + params, err := actors.SerializeParams(&verifregst.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: initialDatacap}) + require.NoError(t, err) + + msg := &types.Message{ + From: verifier1Addr, + To: verifreg.Address, + Method: verifreg.Methods.AddVerifiedClient, + Params: params, + Value: big.Zero(), + } + + sm, err := api.MpoolPushMessage(ctx, msg, nil) + require.NoError(t, err) + + res, err := api.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true) + require.NoError(t, err) + require.EqualValues(t, 0, res.Receipt.ExitCode) + + // check datacap balance + dcap, err := api.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK) + require.NoError(t, err) + require.Equal(t, *dcap, initialDatacap) + + minerId, err := address.IDFromAddress(miner.ActorAddr) + require.NoError(t, err) + + allocationRequest1 := verifregst.AllocationRequest{ + Provider: abi.ActorID(minerId), + Data: cid.MustParse("baga6ea4seaaqa"), + Size: abi.PaddedPieceSize(initialDatacap.Uint64() / 2), + TermMin: verifregst.MinimumVerifiedAllocationTerm, + TermMax: verifregst.MinimumVerifiedAllocationTerm, + Expiration: verifregst.MaximumVerifiedAllocationExpiration, + } + + allocationRequest2 := verifregst.AllocationRequest{ + Provider: abi.ActorID(minerId), + Data: cid.MustParse("baga6ea4seaaqc"), + Size: abi.PaddedPieceSize(initialDatacap.Uint64() / 2), + TermMin: verifregst.MinimumVerifiedAllocationTerm, + TermMax: verifregst.MinimumVerifiedAllocationTerm, + Expiration: verifregst.MaximumVerifiedAllocationExpiration, + } + + allocationRequests := verifregst.AllocationRequests{ + Allocations: []verifregst.AllocationRequest{allocationRequest1, allocationRequest2}, + } + + receiverParams, err := actors.SerializeParams(&allocationRequests) + require.NoError(t, err) + + transferParams, err := actors.SerializeParams(&datacap2.TransferParams{ + To: builtin.VerifiedRegistryActorAddr, + Amount: big.Mul(initialDatacap, builtin.TokenPrecision), + OperatorData: receiverParams, + }) + require.NoError(t, err) + + msg = &types.Message{ + To: builtin.DatacapActorAddr, + From: verifiedClientAddr, + Method: datacap.Methods.TransferExported, + Params: transferParams, + Value: big.Zero(), + } + + sm, err = api.MpoolPushMessage(ctx, msg, nil) + require.NoError(t, err) + + res, err = api.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true) + require.NoError(t, err) + require.EqualValues(t, 0, res.Receipt.ExitCode) + + allocations, err := api.StateGetAllAllocations(ctx, types.EmptyTSK) + require.NoError(t, err) + + require.Equal(t, 2, len(allocations)) + + var pcids []string + + for _, a := range allocations { + clientIdAddr, err := api.StateLookupID(ctx, verifiedClientAddr, types.EmptyTSK) + require.NoError(t, err) + clientId, err := address.IDFromAddress(clientIdAddr) + require.NoError(t, err) + require.Equal(t, abi.ActorID(clientId), a.Client) + require.Equal(t, abi.ActorID(minerId), a.Provider) + require.Equal(t, abi.PaddedPieceSize(10000), a.Size) + pcids = append(pcids, a.Data.String()) + } + + require.ElementsMatch(t, []string{"baga6ea4seaaqa", "baga6ea4seaaqc"}, pcids) + + // TODO: Add claims check to this test once https://github.com/filecoin-project/lotus/pull/11618 lands +} diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 06e4a47c3ea..676935ff537 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -866,6 +866,25 @@ func (a *StateAPI) StateGetAllocations(ctx context.Context, clientAddr address.A return allocations, nil } +func (a *StateAPI) StateGetAllAllocations(ctx context.Context, tsk types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) { + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) + if err != nil { + return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) + } + + st, err := a.StateManager.GetVerifregState(ctx, ts) + if err != nil { + return nil, xerrors.Errorf("loading verifreg state: %w", err) + } + + allocations, err := st.GetAllAllocations() + if err != nil { + return nil, xerrors.Errorf("getting all allocations: %w", err) + } + + return allocations, nil +} + func (a *StateAPI) StateGetClaim(ctx context.Context, providerAddr address.Address, claimId verifreg.ClaimId, tsk types.TipSetKey) (*verifreg.Claim, error) { idAddr, err := a.StateLookupID(ctx, providerAddr, tsk) if err != nil { @@ -917,6 +936,25 @@ func (a *StateAPI) StateGetClaims(ctx context.Context, providerAddr address.Addr return claims, nil } +func (a *StateAPI) StateGetAllClaims(ctx context.Context, tsk types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) { + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) + if err != nil { + return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) + } + + st, err := a.StateManager.GetVerifregState(ctx, ts) + if err != nil { + return nil, xerrors.Errorf("loading verifreg state: %w", err) + } + + claims, err := st.GetAllClaims() + if err != nil { + return nil, xerrors.Errorf("getting all claims: %w", err) + } + + return claims, nil +} + func (a *StateAPI) StateComputeDataCID(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) { nv, err := a.StateNetworkVersion(ctx, tsk) if err != nil {