github.com/vipernet-xyz/tm@v0.34.24/types/protobuf.go (about)

     1  package types
     2  
     3  import (
     4  	abci "github.com/vipernet-xyz/tm/abci/types"
     5  	"github.com/vipernet-xyz/tm/crypto"
     6  	"github.com/vipernet-xyz/tm/crypto/ed25519"
     7  	cryptoenc "github.com/vipernet-xyz/tm/crypto/encoding"
     8  	"github.com/vipernet-xyz/tm/crypto/secp256k1"
     9  	tmproto "github.com/vipernet-xyz/tm/proto/tendermint/types"
    10  )
    11  
    12  //-------------------------------------------------------
    13  // Use strings to distinguish types in ABCI messages
    14  
    15  const (
    16  	ABCIPubKeyTypeEd25519   = ed25519.KeyType
    17  	ABCIPubKeyTypeSecp256k1 = secp256k1.KeyType
    18  )
    19  
    20  // TODO: Make non-global by allowing for registration of more pubkey types
    21  
    22  var ABCIPubKeyTypesToNames = map[string]string{
    23  	ABCIPubKeyTypeEd25519:   ed25519.PubKeyName,
    24  	ABCIPubKeyTypeSecp256k1: secp256k1.PubKeyName,
    25  }
    26  
    27  //-------------------------------------------------------
    28  
    29  // TM2PB is used for converting Tendermint ABCI to protobuf ABCI.
    30  // UNSTABLE
    31  var TM2PB = tm2pb{}
    32  
    33  type tm2pb struct{}
    34  
    35  func (tm2pb) Header(header *Header) tmproto.Header {
    36  	return tmproto.Header{
    37  		Version: header.Version,
    38  		ChainID: header.ChainID,
    39  		Height:  header.Height,
    40  		Time:    header.Time,
    41  
    42  		LastBlockId: header.LastBlockID.ToProto(),
    43  
    44  		LastCommitHash: header.LastCommitHash,
    45  		DataHash:       header.DataHash,
    46  
    47  		ValidatorsHash:     header.ValidatorsHash,
    48  		NextValidatorsHash: header.NextValidatorsHash,
    49  		ConsensusHash:      header.ConsensusHash,
    50  		AppHash:            header.AppHash,
    51  		LastResultsHash:    header.LastResultsHash,
    52  
    53  		EvidenceHash:    header.EvidenceHash,
    54  		ProposerAddress: header.ProposerAddress,
    55  	}
    56  }
    57  
    58  func (tm2pb) Validator(val *Validator) abci.Validator {
    59  	return abci.Validator{
    60  		Address: val.PubKey.Address(),
    61  		Power:   val.VotingPower,
    62  	}
    63  }
    64  
    65  func (tm2pb) BlockID(blockID BlockID) tmproto.BlockID {
    66  	return tmproto.BlockID{
    67  		Hash:          blockID.Hash,
    68  		PartSetHeader: TM2PB.PartSetHeader(blockID.PartSetHeader),
    69  	}
    70  }
    71  
    72  func (tm2pb) PartSetHeader(header PartSetHeader) tmproto.PartSetHeader {
    73  	return tmproto.PartSetHeader{
    74  		Total: header.Total,
    75  		Hash:  header.Hash,
    76  	}
    77  }
    78  
    79  // XXX: panics on unknown pubkey type
    80  func (tm2pb) ValidatorUpdate(val *Validator) abci.ValidatorUpdate {
    81  	pk, err := cryptoenc.PubKeyToProto(val.PubKey)
    82  	if err != nil {
    83  		panic(err)
    84  	}
    85  	return abci.ValidatorUpdate{
    86  		PubKey: pk,
    87  		Power:  val.VotingPower,
    88  	}
    89  }
    90  
    91  // XXX: panics on nil or unknown pubkey type
    92  func (tm2pb) ValidatorUpdates(vals *ValidatorSet) []abci.ValidatorUpdate {
    93  	validators := make([]abci.ValidatorUpdate, vals.Size())
    94  	for i, val := range vals.Validators {
    95  		validators[i] = TM2PB.ValidatorUpdate(val)
    96  	}
    97  	return validators
    98  }
    99  
   100  func (tm2pb) ConsensusParams(params *tmproto.ConsensusParams) *abci.ConsensusParams {
   101  	return &abci.ConsensusParams{
   102  		Block: &abci.BlockParams{
   103  			MaxBytes: params.Block.MaxBytes,
   104  			MaxGas:   params.Block.MaxGas,
   105  		},
   106  		Evidence:  &params.Evidence,
   107  		Validator: &params.Validator,
   108  	}
   109  }
   110  
   111  // XXX: panics on nil or unknown pubkey type
   112  func (tm2pb) NewValidatorUpdate(pubkey crypto.PubKey, power int64) abci.ValidatorUpdate {
   113  	pubkeyABCI, err := cryptoenc.PubKeyToProto(pubkey)
   114  	if err != nil {
   115  		panic(err)
   116  	}
   117  	return abci.ValidatorUpdate{
   118  		PubKey: pubkeyABCI,
   119  		Power:  power,
   120  	}
   121  }
   122  
   123  //----------------------------------------------------------------------------
   124  
   125  // PB2TM is used for converting protobuf ABCI to Tendermint ABCI.
   126  // UNSTABLE
   127  var PB2TM = pb2tm{}
   128  
   129  type pb2tm struct{}
   130  
   131  func (pb2tm) ValidatorUpdates(vals []abci.ValidatorUpdate) ([]*Validator, error) {
   132  	tmVals := make([]*Validator, len(vals))
   133  	for i, v := range vals {
   134  		pub, err := cryptoenc.PubKeyFromProto(v.PubKey)
   135  		if err != nil {
   136  			return nil, err
   137  		}
   138  		tmVals[i] = NewValidator(pub, v.Power)
   139  	}
   140  	return tmVals, nil
   141  }