github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/builtin/init/testing.go (about)

     1  package init
     2  
     3  import (
     4  	addr "github.com/filecoin-project/go-address"
     5  	"github.com/filecoin-project/go-state-types/abi"
     6  	cbg "github.com/whyrusleeping/cbor-gen"
     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  	AddrIDs map[addr.Address]abi.ActorID
    14  	NextID  abi.ActorID
    15  }
    16  
    17  // Checks internal invariants of init state.
    18  func CheckStateInvariants(st *State, store adt.Store) (*StateSummary, *builtin.MessageAccumulator) {
    19  	acc := &builtin.MessageAccumulator{}
    20  
    21  	acc.Require(len(st.NetworkName) > 0, "network name is empty")
    22  	acc.Require(st.NextID >= builtin.FirstNonSingletonActorId, "next id %d is too low", st.NextID)
    23  
    24  	initSummary := &StateSummary{
    25  		AddrIDs: nil,
    26  		NextID:  st.NextID,
    27  	}
    28  
    29  	lut, err := adt.AsMap(store, st.AddressMap, builtin.DefaultHamtBitwidth)
    30  	if err != nil {
    31  		acc.Addf("error loading address map: %v", err)
    32  		// Stop here, it's hard to make other useful checks.
    33  		return initSummary, acc
    34  	}
    35  
    36  	initSummary.AddrIDs = map[addr.Address]abi.ActorID{}
    37  	reverse := map[abi.ActorID]addr.Address{}
    38  	var value cbg.CborInt
    39  	err = lut.ForEach(&value, func(key string) error {
    40  		actorId := abi.ActorID(value)
    41  		keyAddr, err := addr.NewFromBytes([]byte(key))
    42  		if err != nil {
    43  			return err
    44  		}
    45  
    46  		acc.Require(keyAddr.Protocol() != addr.ID, "key %v is an ID address", keyAddr)
    47  		acc.Require(keyAddr.Protocol() <= addr.BLS, "unknown address protocol for key %v", keyAddr)
    48  		acc.Require(actorId >= builtin.FirstNonSingletonActorId, "unexpected singleton ID value %v", actorId)
    49  
    50  		foundAddr, found := reverse[actorId]
    51  		acc.Require(!found, "duplicate mapping to ID %v: %v, %v", actorId, keyAddr, foundAddr)
    52  		reverse[actorId] = keyAddr
    53  
    54  		initSummary.AddrIDs[keyAddr] = actorId
    55  		return nil
    56  	})
    57  	acc.RequireNoError(err, "error iterating address map")
    58  	return initSummary, acc
    59  }