diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 450079072..740969625 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -26,6 +26,7 @@ BREAKING CHANGES: * Blockchain Protocol * [types] \#2459 `Vote`/`Proposal`/`Heartbeat` use amino encoding instead of JSON in `SignBytes`. + * [types] \#2512 Remove the pubkey field from the validator hash * P2P Protocol diff --git a/docs/spec/blockchain/state.md b/docs/spec/blockchain/state.md index 349fd4223..e904bb339 100644 --- a/docs/spec/blockchain/state.md +++ b/docs/spec/blockchain/state.md @@ -45,7 +45,7 @@ processing transactions, like gas variables and tags - see ### Validator A validator is an active participant in the consensus with a public key and a voting power. -Validator's also contain an address which is derived from the PubKey: +Validator's also contain an address field, which is a hash digest of the PubKey. ```go type Validator struct { @@ -55,6 +55,9 @@ type Validator struct { } ``` +When hashing the Validator struct, the pubkey is not hashed, +because the address is already the hash of the pubkey. + The `state.Validators`, `state.LastValidators`, and `state.NextValidators`, must always by sorted by validator address, so that there is a canonical order for computing the SimpleMerkleRoot. diff --git a/types/validator.go b/types/validator.go index e43acf09d..46d1a7a9f 100644 --- a/types/validator.go +++ b/types/validator.go @@ -73,11 +73,9 @@ func (v *Validator) String() string { func (v *Validator) Hash() []byte { return aminoHash(struct { Address Address - PubKey crypto.PubKey VotingPower int64 }{ v.Address, - v.PubKey, v.VotingPower, }) }