github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/native/iblockproc/profiles.go (about) 1 package iblockproc 2 3 import ( 4 "io" 5 "math/big" 6 7 "github.com/unicornultrafoundation/go-helios/native/idx" 8 "github.com/unicornultrafoundation/go-helios/native/pos" 9 "github.com/unicornultrafoundation/go-u2u/rlp" 10 11 "github.com/unicornultrafoundation/go-u2u/native/drivertype" 12 ) 13 14 type ValidatorProfiles map[idx.ValidatorID]drivertype.Validator 15 16 func (vv ValidatorProfiles) Copy() ValidatorProfiles { 17 cp := make(ValidatorProfiles, len(vv)) 18 for k, v := range vv { 19 cpv := v 20 cpv.Weight = new(big.Int).Set(cpv.Weight) 21 cpv.PubKey = cpv.PubKey.Copy() 22 cp[k] = cpv 23 } 24 return cp 25 } 26 27 func (vv ValidatorProfiles) SortedArray() []drivertype.ValidatorAndID { 28 builder := pos.NewBigBuilder() 29 for id, profile := range vv { 30 builder.Set(id, profile.Weight) 31 } 32 validators := builder.Build() 33 sortedIds := validators.SortedIDs() 34 arr := make([]drivertype.ValidatorAndID, validators.Len()) 35 for i, id := range sortedIds { 36 arr[i] = drivertype.ValidatorAndID{ 37 ValidatorID: id, 38 Validator: vv[id], 39 } 40 } 41 return arr 42 } 43 44 // EncodeRLP is for RLP serialization. 45 func (vv ValidatorProfiles) EncodeRLP(w io.Writer) error { 46 return rlp.Encode(w, vv.SortedArray()) 47 } 48 49 // DecodeRLP is for RLP deserialization. 50 func (vv *ValidatorProfiles) DecodeRLP(s *rlp.Stream) error { 51 var arr []drivertype.ValidatorAndID 52 if err := s.Decode(&arr); err != nil { 53 return err 54 } 55 56 *vv = make(ValidatorProfiles, len(arr)) 57 58 for _, it := range arr { 59 (*vv)[it.ValidatorID] = it.Validator 60 } 61 62 return nil 63 }