mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-06 16:17:11 +00:00
Refactor so building and linting works
This is the first step towards implementing vote extensions: generating the relevant proto stubs and getting the build and linter to pass. Signed-off-by: Thane Thomson <connect@thanethomson.com>
This commit is contained in:
+7
-14
@@ -603,21 +603,19 @@ const (
|
||||
|
||||
// CommitSig is a part of the Vote included in a Commit.
|
||||
type CommitSig struct {
|
||||
BlockIDFlag BlockIDFlag `json:"block_id_flag"`
|
||||
ValidatorAddress Address `json:"validator_address"`
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
Signature []byte `json:"signature"`
|
||||
VoteExtension VoteExtensionToSign `json:"vote_extension"`
|
||||
BlockIDFlag BlockIDFlag `json:"block_id_flag"`
|
||||
ValidatorAddress Address `json:"validator_address"`
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
Signature []byte `json:"signature"`
|
||||
}
|
||||
|
||||
// NewCommitSigForBlock returns new CommitSig with BlockIDFlagCommit.
|
||||
func NewCommitSigForBlock(signature []byte, valAddr Address, ts time.Time, ext VoteExtensionToSign) CommitSig {
|
||||
func NewCommitSigForBlock(signature []byte, valAddr Address, ts time.Time) CommitSig {
|
||||
return CommitSig{
|
||||
BlockIDFlag: BlockIDFlagCommit,
|
||||
ValidatorAddress: valAddr,
|
||||
Timestamp: ts,
|
||||
Signature: signature,
|
||||
VoteExtension: ext,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -650,14 +648,12 @@ func (cs CommitSig) Absent() bool {
|
||||
// 1. first 6 bytes of signature
|
||||
// 2. first 6 bytes of validator address
|
||||
// 3. block ID flag
|
||||
// 4. first 6 bytes of the vote extension
|
||||
// 5. timestamp
|
||||
// 4. timestamp
|
||||
func (cs CommitSig) String() string {
|
||||
return fmt.Sprintf("CommitSig{%X by %X on %v with %X @ %s}",
|
||||
return fmt.Sprintf("CommitSig{%X by %X on %v @ %s}",
|
||||
tmbytes.Fingerprint(cs.Signature),
|
||||
tmbytes.Fingerprint(cs.ValidatorAddress),
|
||||
cs.BlockIDFlag,
|
||||
tmbytes.Fingerprint(cs.VoteExtension.BytesPacked()),
|
||||
CanonicalTime(cs.Timestamp))
|
||||
}
|
||||
|
||||
@@ -729,7 +725,6 @@ func (cs *CommitSig) ToProto() *tmproto.CommitSig {
|
||||
ValidatorAddress: cs.ValidatorAddress,
|
||||
Timestamp: cs.Timestamp,
|
||||
Signature: cs.Signature,
|
||||
VoteExtension: cs.VoteExtension.ToProto(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -741,7 +736,6 @@ func (cs *CommitSig) FromProto(csp tmproto.CommitSig) error {
|
||||
cs.ValidatorAddress = csp.ValidatorAddress
|
||||
cs.Timestamp = csp.Timestamp
|
||||
cs.Signature = csp.Signature
|
||||
cs.VoteExtension = VoteExtensionToSignFromProto(csp.VoteExtension)
|
||||
|
||||
return cs.ValidateBasic()
|
||||
}
|
||||
@@ -808,7 +802,6 @@ func (commit *Commit) GetVote(valIdx int32) *Vote {
|
||||
ValidatorAddress: commitSig.ValidatorAddress,
|
||||
ValidatorIndex: valIdx,
|
||||
Signature: commitSig.Signature,
|
||||
VoteExtension: commitSig.VoteExtension.ToVoteExtension(),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-16
@@ -51,26 +51,16 @@ func CanonicalizeProposal(chainID string, proposal *tmproto.Proposal) tmproto.Ca
|
||||
}
|
||||
}
|
||||
|
||||
func GetVoteExtensionToSign(ext *tmproto.VoteExtension) *tmproto.VoteExtensionToSign {
|
||||
if ext == nil {
|
||||
return nil
|
||||
}
|
||||
return &tmproto.VoteExtensionToSign{
|
||||
AppDataToSign: ext.AppDataToSign,
|
||||
}
|
||||
}
|
||||
|
||||
// CanonicalizeVote transforms the given Vote to a CanonicalVote, which does
|
||||
// not contain ValidatorIndex and ValidatorAddress fields.
|
||||
func CanonicalizeVote(chainID string, vote *tmproto.Vote) tmproto.CanonicalVote {
|
||||
return tmproto.CanonicalVote{
|
||||
Type: vote.Type,
|
||||
Height: vote.Height, // encoded as sfixed64
|
||||
Round: int64(vote.Round), // encoded as sfixed64
|
||||
BlockID: CanonicalizeBlockID(vote.BlockID),
|
||||
Timestamp: vote.Timestamp,
|
||||
ChainID: chainID,
|
||||
VoteExtension: GetVoteExtensionToSign(vote.VoteExtension),
|
||||
Type: vote.Type,
|
||||
Height: vote.Height, // encoded as sfixed64
|
||||
Round: int64(vote.Round), // encoded as sfixed64
|
||||
BlockID: CanonicalizeBlockID(vote.BlockID),
|
||||
Timestamp: vote.Timestamp,
|
||||
ChainID: chainID,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
-123
@@ -46,86 +46,19 @@ func NewConflictingVoteError(vote1, vote2 *Vote) *ErrVoteConflictingVotes {
|
||||
// Address is hex bytes.
|
||||
type Address = crypto.Address
|
||||
|
||||
// VoteExtensionToSign is a subset of VoteExtension
|
||||
// that is signed by the validators private key
|
||||
type VoteExtensionToSign struct {
|
||||
AppDataToSign []byte `json:"app_data_to_sign"`
|
||||
}
|
||||
|
||||
func (ext VoteExtensionToSign) ToProto() *tmproto.VoteExtensionToSign {
|
||||
if ext.IsEmpty() {
|
||||
return nil
|
||||
}
|
||||
return &tmproto.VoteExtensionToSign{
|
||||
AppDataToSign: ext.AppDataToSign,
|
||||
}
|
||||
}
|
||||
|
||||
func VoteExtensionToSignFromProto(pext *tmproto.VoteExtensionToSign) VoteExtensionToSign {
|
||||
if pext == nil {
|
||||
return VoteExtensionToSign{}
|
||||
}
|
||||
return VoteExtensionToSign{
|
||||
AppDataToSign: pext.AppDataToSign,
|
||||
}
|
||||
}
|
||||
|
||||
func (ext VoteExtensionToSign) IsEmpty() bool {
|
||||
return len(ext.AppDataToSign) == 0
|
||||
}
|
||||
|
||||
// BytesPacked returns a bytes-packed representation for
|
||||
// debugging and human identification. This function should
|
||||
// not be used for any logical operations.
|
||||
func (ext VoteExtensionToSign) BytesPacked() []byte {
|
||||
res := []byte{}
|
||||
res = append(res, ext.AppDataToSign...)
|
||||
return res
|
||||
}
|
||||
|
||||
// ToVoteExtension constructs a VoteExtension from a VoteExtensionToSign
|
||||
func (ext VoteExtensionToSign) ToVoteExtension() VoteExtension {
|
||||
return VoteExtension{
|
||||
AppDataToSign: ext.AppDataToSign,
|
||||
}
|
||||
}
|
||||
|
||||
// VoteExtension is a set of data provided by the application
|
||||
// that is additionally included in the vote
|
||||
type VoteExtension struct {
|
||||
AppDataToSign []byte `json:"app_data_to_sign"`
|
||||
AppDataSelfAuthenticating []byte `json:"app_data_self_authenticating"`
|
||||
}
|
||||
|
||||
// ToSign constructs a VoteExtensionToSign from a VoteExtenstion
|
||||
func (ext VoteExtension) ToSign() VoteExtensionToSign {
|
||||
return VoteExtensionToSign{
|
||||
AppDataToSign: ext.AppDataToSign,
|
||||
}
|
||||
}
|
||||
|
||||
// BytesPacked returns a bytes-packed representation for
|
||||
// debugging and human identification. This function should
|
||||
// not be used for any logical operations.
|
||||
func (ext VoteExtension) BytesPacked() []byte {
|
||||
res := []byte{}
|
||||
res = append(res, ext.AppDataToSign...)
|
||||
res = append(res, ext.AppDataSelfAuthenticating...)
|
||||
return res
|
||||
}
|
||||
|
||||
// Vote represents a prevote, precommit, or commit vote from validators for
|
||||
// consensus.
|
||||
type Vote struct {
|
||||
Type tmproto.SignedMsgType `json:"type"`
|
||||
Height int64 `json:"height,string"`
|
||||
Round int32 `json:"round"` // assume there will not be greater than 2_147_483_647 rounds
|
||||
BlockID BlockID `json:"block_id"` // zero if vote is nil.
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
ValidatorAddress Address `json:"validator_address"`
|
||||
ValidatorIndex int32 `json:"validator_index"`
|
||||
Signature []byte `json:"signature"`
|
||||
VoteExtension VoteExtension `json:"vote_extension"`
|
||||
Type tmproto.SignedMsgType `json:"type"`
|
||||
Height int64 `json:"height,string"`
|
||||
Round int32 `json:"round"` // assume there will not be greater than 2_147_483_647 rounds
|
||||
BlockID BlockID `json:"block_id"` // zero if vote is nil.
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
ValidatorAddress Address `json:"validator_address"`
|
||||
ValidatorIndex int32 `json:"validator_index"`
|
||||
Signature []byte `json:"signature"`
|
||||
Extension []byte `json:"extension"`
|
||||
ExtensionSignature []byte `json:"extension_signature"`
|
||||
}
|
||||
|
||||
// CommitSig converts the Vote to a CommitSig.
|
||||
@@ -149,7 +82,6 @@ func (vote *Vote) CommitSig() CommitSig {
|
||||
ValidatorAddress: vote.ValidatorAddress,
|
||||
Timestamp: vote.Timestamp,
|
||||
Signature: vote.Signature,
|
||||
VoteExtension: vote.VoteExtension.ToSign(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,7 +105,6 @@ func VoteSignBytes(chainID string, vote *tmproto.Vote) []byte {
|
||||
|
||||
func (vote *Vote) Copy() *Vote {
|
||||
voteCopy := *vote
|
||||
voteCopy.VoteExtension = vote.VoteExtension.Copy()
|
||||
return &voteCopy
|
||||
}
|
||||
|
||||
@@ -187,8 +118,7 @@ func (vote *Vote) Copy() *Vote {
|
||||
// 6. type string
|
||||
// 7. first 6 bytes of block hash
|
||||
// 8. first 6 bytes of signature
|
||||
// 9. first 6 bytes of vote extension
|
||||
// 10. timestamp
|
||||
// 9. timestamp
|
||||
func (vote *Vote) String() string {
|
||||
if vote == nil {
|
||||
return nilVoteStr
|
||||
@@ -204,7 +134,7 @@ func (vote *Vote) String() string {
|
||||
panic("Unknown vote type")
|
||||
}
|
||||
|
||||
return fmt.Sprintf("Vote{%v:%X %v/%02d/%v(%v) %X %X %X @ %s}",
|
||||
return fmt.Sprintf("Vote{%v:%X %v/%02d/%v(%v) %X %X @ %s}",
|
||||
vote.ValidatorIndex,
|
||||
tmbytes.Fingerprint(vote.ValidatorAddress),
|
||||
vote.Height,
|
||||
@@ -213,7 +143,6 @@ func (vote *Vote) String() string {
|
||||
typeString,
|
||||
tmbytes.Fingerprint(vote.BlockID.Hash),
|
||||
tmbytes.Fingerprint(vote.Signature),
|
||||
tmbytes.Fingerprint(vote.VoteExtension.BytesPacked()),
|
||||
CanonicalTime(vote.Timestamp),
|
||||
)
|
||||
}
|
||||
@@ -277,35 +206,6 @@ func (vote *Vote) ValidateBasic() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ext VoteExtension) Copy() VoteExtension {
|
||||
res := VoteExtension{
|
||||
AppDataToSign: ext.AppDataToSign,
|
||||
AppDataSelfAuthenticating: ext.AppDataSelfAuthenticating,
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (ext VoteExtension) IsEmpty() bool {
|
||||
if len(ext.AppDataToSign) != 0 {
|
||||
return false
|
||||
}
|
||||
if len(ext.AppDataSelfAuthenticating) != 0 {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (ext VoteExtension) ToProto() *tmproto.VoteExtension {
|
||||
if ext.IsEmpty() {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &tmproto.VoteExtension{
|
||||
AppDataToSign: ext.AppDataToSign,
|
||||
AppDataSelfAuthenticating: ext.AppDataSelfAuthenticating,
|
||||
}
|
||||
}
|
||||
|
||||
// ToProto converts the handwritten type to proto generated type
|
||||
// return type, nil if everything converts safely, otherwise nil, error
|
||||
func (vote *Vote) ToProto() *tmproto.Vote {
|
||||
@@ -322,7 +222,6 @@ func (vote *Vote) ToProto() *tmproto.Vote {
|
||||
ValidatorAddress: vote.ValidatorAddress,
|
||||
ValidatorIndex: vote.ValidatorIndex,
|
||||
Signature: vote.Signature,
|
||||
VoteExtension: vote.VoteExtension.ToProto(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -342,15 +241,6 @@ func VotesToProto(votes []*Vote) []*tmproto.Vote {
|
||||
return res
|
||||
}
|
||||
|
||||
func VoteExtensionFromProto(pext *tmproto.VoteExtension) VoteExtension {
|
||||
ext := VoteExtension{}
|
||||
if pext != nil {
|
||||
ext.AppDataToSign = pext.AppDataToSign
|
||||
ext.AppDataSelfAuthenticating = pext.AppDataSelfAuthenticating
|
||||
}
|
||||
return ext
|
||||
}
|
||||
|
||||
// FromProto converts a proto generetad type to a handwritten type
|
||||
// return type, nil if everything converts safely, otherwise nil, error
|
||||
func VoteFromProto(pv *tmproto.Vote) (*Vote, error) {
|
||||
@@ -372,7 +262,6 @@ func VoteFromProto(pv *tmproto.Vote) (*Vote, error) {
|
||||
vote.ValidatorAddress = pv.ValidatorAddress
|
||||
vote.ValidatorIndex = pv.ValidatorIndex
|
||||
vote.Signature = pv.Signature
|
||||
vote.VoteExtension = VoteExtensionFromProto(pv.VoteExtension)
|
||||
|
||||
return vote, vote.ValidateBasic()
|
||||
}
|
||||
|
||||
+12
-4
@@ -130,10 +130,18 @@ func TestVoteSignBytesTestVectors(t *testing.T) {
|
||||
},
|
||||
// containing vote extension
|
||||
5: {
|
||||
"test_chain_id", &Vote{Height: 1, Round: 1, VoteExtension: VoteExtension{
|
||||
AppDataToSign: []byte("signed"),
|
||||
AppDataSelfAuthenticating: []byte("auth"),
|
||||
}},
|
||||
"test_chain_id", &Vote{
|
||||
Type: 0,
|
||||
Height: 1,
|
||||
Round: 1,
|
||||
BlockID: BlockID{},
|
||||
Timestamp: time.Time{},
|
||||
ValidatorAddress: []byte{},
|
||||
ValidatorIndex: 0,
|
||||
Signature: []byte{},
|
||||
Extension: []byte("signed"),
|
||||
ExtensionSignature: []byte{},
|
||||
},
|
||||
[]byte{
|
||||
0x38, // length
|
||||
0x11, // (field_number << 3) | wire_type
|
||||
|
||||
Reference in New Issue
Block a user