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  }