package types import ( "github.com/tendermint/go-wire/data" ) // canonical json is go-wire's json for structs with fields in alphabetical order type CanonicalJSONBlockID struct { Hash data.Bytes `json:"hash,omitempty"` PartsHeader CanonicalJSONPartSetHeader `json:"parts,omitempty"` } type CanonicalJSONPartSetHeader struct { Hash data.Bytes `json:"hash"` Total int `json:"total"` } type CanonicalJSONProposal struct { BlockPartsHeader CanonicalJSONPartSetHeader `json:"block_parts_header"` Height int `json:"height"` POLBlockID CanonicalJSONBlockID `json:"pol_block_id"` POLRound int `json:"pol_round"` Round int `json:"round"` } type CanonicalJSONVote struct { BlockID CanonicalJSONBlockID `json:"block_id"` Height int `json:"height"` Round int `json:"round"` Type byte `json:"type"` } type CanonicalJSONHeartbeat struct { Height int `json:"height"` Round int `json:"round"` Sequence int `json:"sequence"` ValidatorAddress data.Bytes `json:"validator_address"` ValidatorIndex int `json:"validator_index"` } //------------------------------------ // Messages including a "chain id" can only be applied to one chain, hence "Once" type CanonicalJSONOnceProposal struct { ChainID string `json:"chain_id"` Proposal CanonicalJSONProposal `json:"proposal"` } type CanonicalJSONOnceVote struct { ChainID string `json:"chain_id"` Vote CanonicalJSONVote `json:"vote"` } type CanonicalJSONOnceHeartbeat struct { ChainID string `json:"chain_id"` Heartbeat CanonicalJSONHeartbeat `json:"heartbeat"` } //----------------------------------- // Canonicalize the structs func CanonicalBlockID(blockID BlockID) CanonicalJSONBlockID { return CanonicalJSONBlockID{ Hash: blockID.Hash, PartsHeader: CanonicalPartSetHeader(blockID.PartsHeader), } } func CanonicalPartSetHeader(psh PartSetHeader) CanonicalJSONPartSetHeader { return CanonicalJSONPartSetHeader{ psh.Hash, psh.Total, } } func CanonicalProposal(proposal *Proposal) CanonicalJSONProposal { return CanonicalJSONProposal{ BlockPartsHeader: CanonicalPartSetHeader(proposal.BlockPartsHeader), Height: proposal.Height, POLBlockID: CanonicalBlockID(proposal.POLBlockID), POLRound: proposal.POLRound, Round: proposal.Round, } } func CanonicalVote(vote *Vote) CanonicalJSONVote { return CanonicalJSONVote{ CanonicalBlockID(vote.BlockID), vote.Height, vote.Round, vote.Type, } } func CanonicalHeartbeat(heartbeat *Heartbeat) CanonicalJSONHeartbeat { return CanonicalJSONHeartbeat{ heartbeat.Height, heartbeat.Round, heartbeat.Sequence, heartbeat.ValidatorAddress, heartbeat.ValidatorIndex, } }