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 }