github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/builtin/verifreg/testing.go (about) 1 package verifreg 2 3 import ( 4 addr "github.com/filecoin-project/go-address" 5 "github.com/filecoin-project/go-state-types/abi" 6 "github.com/filecoin-project/go-state-types/big" 7 8 "github.com/filecoin-project/specs-actors/v4/actors/builtin" 9 "github.com/filecoin-project/specs-actors/v4/actors/util/adt" 10 ) 11 12 type StateSummary struct { 13 Verifiers map[addr.Address]DataCap 14 Clients map[addr.Address]DataCap 15 } 16 17 // Checks internal invariants of verified registry state. 18 func CheckStateInvariants(st *State, store adt.Store) (*StateSummary, *builtin.MessageAccumulator) { 19 acc := &builtin.MessageAccumulator{} 20 acc.Require(st.RootKey.Protocol() == addr.ID, "root key %v should have ID protocol", st.RootKey) 21 22 // Check verifiers 23 allVerifiers := map[addr.Address]DataCap{} 24 if verifiers, err := adt.AsMap(store, st.Verifiers, builtin.DefaultHamtBitwidth); err != nil { 25 acc.Addf("error loading verifiers: %v", err) 26 } else { 27 var vcap abi.StoragePower 28 err = verifiers.ForEach(&vcap, func(key string) error { 29 verifier, err := addr.NewFromBytes([]byte(key)) 30 if err != nil { 31 return err 32 } 33 acc.Require(verifier.Protocol() == addr.ID, "verifier %v should have ID protocol", verifier) 34 acc.Require(vcap.GreaterThanEqual(big.Zero()), "verifier %v cap %v is negative", verifier, vcap) 35 allVerifiers[verifier] = vcap.Copy() 36 return nil 37 }) 38 acc.RequireNoError(err, "error iterating verifiers") 39 } 40 41 42 // Check clients 43 allClients := map[addr.Address]DataCap{} 44 if clients, err := adt.AsMap(store, st.VerifiedClients, builtin.DefaultHamtBitwidth); err != nil { 45 acc.Addf("error loading clients: %v", err) 46 } else { 47 var ccap abi.StoragePower 48 err = clients.ForEach(&ccap, func(key string) error { 49 client, err := addr.NewFromBytes([]byte(key)) 50 if err != nil { 51 return err 52 } 53 acc.Require(client.Protocol() == addr.ID, "client %v should have ID protocol", client) 54 acc.Require(ccap.GreaterThanEqual(big.Zero()), "client %v cap %v is negative", client, ccap) 55 allClients[client] = ccap.Copy() 56 return nil 57 }) 58 acc.RequireNoError(err, "error iterating clients") 59 } 60 61 // Check verifiers and clients are disjoint. 62 for v := range allVerifiers { //nolint:nomaprange 63 _, found := allClients[v] 64 acc.Require(!found, "verifier %v is also a client", v) 65 } 66 // No need to iterate all clients; any overlap must have been one of all verifiers. 67 68 return &StateSummary{ 69 Verifiers: allVerifiers, 70 Clients: allClients, 71 }, acc 72 }