package types import ( "fmt" "reflect" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" ) // TM2PB is used for converting Tendermint abci to protobuf abci. // UNSTABLE var TM2PB = tm2pb{} type tm2pb struct{} func (tm2pb) Header(header *Header) abci.Header { return abci.Header{ ChainID: header.ChainID, Height: header.Height, Time: header.Time.Unix(), NumTxs: int32(header.NumTxs), // XXX: overflow LastBlockHash: header.LastBlockID.Hash, AppHash: header.AppHash, } } func (tm2pb) Validator(val *Validator) abci.Validator { return abci.Validator{ PubKey: TM2PB.PubKey(val.PubKey), Power: val.VotingPower, } } func (tm2pb) PubKey(pubKey crypto.PubKey) abci.PubKey { switch pk := pubKey.(type) { case crypto.PubKeyEd25519: return abci.PubKey{ Type: "ed25519", Data: pk[:], } case crypto.PubKeySecp256k1: return abci.PubKey{ Type: "secp256k1", Data: pk[:], } default: panic(fmt.Sprintf("unknown pubkey type: %v %v", pubKey, reflect.TypeOf(pubKey))) } } func (tm2pb) Validators(vals *ValidatorSet) []abci.Validator { validators := make([]abci.Validator, len(vals.Validators)) for i, val := range vals.Validators { validators[i] = TM2PB.Validator(val) } return validators } func (tm2pb) ConsensusParams(params *ConsensusParams) *abci.ConsensusParams { return &abci.ConsensusParams{ BlockSize: &abci.BlockSize{ MaxBytes: int32(params.BlockSize.MaxBytes), MaxTxs: int32(params.BlockSize.MaxTxs), MaxGas: params.BlockSize.MaxGas, }, TxSize: &abci.TxSize{ MaxBytes: int32(params.TxSize.MaxBytes), MaxGas: params.TxSize.MaxGas, }, BlockGossip: &abci.BlockGossip{ BlockPartSizeBytes: int32(params.BlockGossip.BlockPartSizeBytes), }, } } func (tm2pb) Evidence(ev_ Evidence) abci.Evidence { switch ev := ev_.(type) { case *DuplicateVoteEvidence: return abci.Evidence{ Type: "duplicate/vote", Validator: abci.Validator{ Address: ev.Address(), // TODO }, Height: ev.Height(), // Time: ev.Time(), // TotalVotingPower: 10, } case *MockGoodEvidence, MockGoodEvidence: return abci.Evidence{ Type: "mock/good", Validator: abci.Validator{ Address: ev.Address(), // TODO }, Height: ev.Height(), // Time: ev.Time(), // TotalVotingPower: 10, } default: panic(fmt.Sprintf("Unknown evidence type: %v %v", ev_, reflect.TypeOf(ev_))) } } func (tm2pb) ValidatorFromPubKeyAndPower(pubkey crypto.PubKey, power int64) abci.Validator { pubkeyABCI := TM2PB.PubKey(pubkey) return abci.Validator{ Address: pubkey.Address(), PubKey: pubkeyABCI, Power: power, } } //---------------------------------------------------------------------------- // PB2TM is used for converting protobuf abci to Tendermint abci. // UNSTABLE var PB2TM = pb2tm{} type pb2tm struct{} // TODO: validate key lengths ... func (pb2tm) PubKey(pubKey abci.PubKey) (crypto.PubKey, error) { switch pubKey.Type { case "ed25519": var pk crypto.PubKeyEd25519 copy(pk[:], pubKey.Data) return pk, nil case "secp256k1": var pk crypto.PubKeySecp256k1 copy(pk[:], pubKey.Data) return pk, nil default: return nil, fmt.Errorf("Unknown pubkey type %v", pubKey.Type) } }