github.com/badrootd/celestia-core@v0.0.0-20240305091328-aa4207a4b25d/types/protobuf.go (about)

     1  package types
     2  
     3  import (
     4  	abci "github.com/badrootd/celestia-core/abci/types"
     5  	"github.com/badrootd/celestia-core/crypto"
     6  	cryptoenc "github.com/badrootd/celestia-core/crypto/encoding"
     7  	cmtproto "github.com/badrootd/celestia-core/proto/tendermint/types"
     8  )
     9  
    10  //-------------------------------------------------------
    11  
    12  // TM2PB is used for converting CometBFT ABCI to protobuf ABCI.
    13  // UNSTABLE
    14  var TM2PB = tm2pb{}
    15  
    16  type tm2pb struct{}
    17  
    18  func (tm2pb) Header(header *Header) cmtproto.Header {
    19  	return cmtproto.Header{
    20  		Version: header.Version,
    21  		ChainID: header.ChainID,
    22  		Height:  header.Height,
    23  		Time:    header.Time,
    24  
    25  		LastBlockId: header.LastBlockID.ToProto(),
    26  
    27  		LastCommitHash: header.LastCommitHash,
    28  		DataHash:       header.DataHash,
    29  
    30  		ValidatorsHash:     header.ValidatorsHash,
    31  		NextValidatorsHash: header.NextValidatorsHash,
    32  		ConsensusHash:      header.ConsensusHash,
    33  		AppHash:            header.AppHash,
    34  		LastResultsHash:    header.LastResultsHash,
    35  
    36  		EvidenceHash:    header.EvidenceHash,
    37  		ProposerAddress: header.ProposerAddress,
    38  	}
    39  }
    40  
    41  func (tm2pb) Validator(val *Validator) abci.Validator {
    42  	return abci.Validator{
    43  		Address: val.PubKey.Address(),
    44  		Power:   val.VotingPower,
    45  	}
    46  }
    47  
    48  func (tm2pb) BlockID(blockID BlockID) cmtproto.BlockID {
    49  	return cmtproto.BlockID{
    50  		Hash:          blockID.Hash,
    51  		PartSetHeader: TM2PB.PartSetHeader(blockID.PartSetHeader),
    52  	}
    53  }
    54  
    55  func (tm2pb) PartSetHeader(header PartSetHeader) cmtproto.PartSetHeader {
    56  	return cmtproto.PartSetHeader{
    57  		Total: header.Total,
    58  		Hash:  header.Hash,
    59  	}
    60  }
    61  
    62  // XXX: panics on unknown pubkey type
    63  func (tm2pb) ValidatorUpdate(val *Validator) abci.ValidatorUpdate {
    64  	pk, err := cryptoenc.PubKeyToProto(val.PubKey)
    65  	if err != nil {
    66  		panic(err)
    67  	}
    68  	return abci.ValidatorUpdate{
    69  		PubKey: pk,
    70  		Power:  val.VotingPower,
    71  	}
    72  }
    73  
    74  // XXX: panics on nil or unknown pubkey type
    75  func (tm2pb) ValidatorUpdates(vals *ValidatorSet) []abci.ValidatorUpdate {
    76  	validators := make([]abci.ValidatorUpdate, vals.Size())
    77  	for i, val := range vals.Validators {
    78  		validators[i] = TM2PB.ValidatorUpdate(val)
    79  	}
    80  	return validators
    81  }
    82  
    83  // XXX: panics on nil or unknown pubkey type
    84  func (tm2pb) NewValidatorUpdate(pubkey crypto.PubKey, power int64) abci.ValidatorUpdate {
    85  	pubkeyABCI, err := cryptoenc.PubKeyToProto(pubkey)
    86  	if err != nil {
    87  		panic(err)
    88  	}
    89  	return abci.ValidatorUpdate{
    90  		PubKey: pubkeyABCI,
    91  		Power:  power,
    92  	}
    93  }
    94  
    95  //----------------------------------------------------------------------------
    96  
    97  // PB2TM is used for converting protobuf ABCI to CometBFT ABCI.
    98  // UNSTABLE
    99  var PB2TM = pb2tm{}
   100  
   101  type pb2tm struct{}
   102  
   103  func (pb2tm) ValidatorUpdates(vals []abci.ValidatorUpdate) ([]*Validator, error) {
   104  	tmVals := make([]*Validator, len(vals))
   105  	for i, v := range vals {
   106  		pub, err := cryptoenc.PubKeyFromProto(v.PubKey)
   107  		if err != nil {
   108  			return nil, err
   109  		}
   110  		tmVals[i] = NewValidator(pub, v.Power)
   111  	}
   112  	return tmVals, nil
   113  }