github.com/Oyster-zx/tendermint@v0.34.24-fork/types/protobuf.go (about) 1 package types 2 3 import ( 4 abci "github.com/tendermint/tendermint/abci/types" 5 "github.com/tendermint/tendermint/crypto" 6 "github.com/tendermint/tendermint/crypto/ed25519" 7 cryptoenc "github.com/tendermint/tendermint/crypto/encoding" 8 "github.com/tendermint/tendermint/crypto/secp256k1" 9 tmproto "github.com/tendermint/tendermint/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: ¶ms.Evidence, 107 Validator: ¶ms.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 }