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  }