mirror of
https://github.com/fluencelabs/tendermint
synced 2025-07-30 19:51:58 +00:00
PrivValidatorFS is like old PrivValidator, for now
This commit is contained in:
@@ -37,8 +37,8 @@ func voteToStep(vote *Vote) int8 {
|
||||
// PrivValidator defines the functionality of a local Tendermint validator
|
||||
// that signs votes, proposals, and heartbeats, and never double signs.
|
||||
type PrivValidator interface {
|
||||
Address() data.Bytes // redundant since .PubKey().Address()
|
||||
PubKey() crypto.PubKey
|
||||
GetAddress() data.Bytes // redundant since .PubKey().Address()
|
||||
GetPubKey() crypto.PubKey
|
||||
|
||||
SignVote(chainID string, vote *Vote) error
|
||||
SignProposal(chainID string, proposal *Proposal) error
|
||||
@@ -49,29 +49,34 @@ type PrivValidator interface {
|
||||
// to prevent double signing. The Signer itself can be mutated to use
|
||||
// something besides the default, for instance a hardware signer.
|
||||
type PrivValidatorFS struct {
|
||||
ID ValidatorID `json:"id"`
|
||||
Signer Signer `json:"signer"`
|
||||
Address data.Bytes `json:"address"`
|
||||
PubKey crypto.PubKey `json:"pub_key"`
|
||||
LastHeight int `json:"last_height"`
|
||||
LastRound int `json:"last_round"`
|
||||
LastStep int8 `json:"last_step"`
|
||||
LastSignature crypto.Signature `json:"last_signature,omitempty"` // so we dont lose signatures
|
||||
LastSignBytes data.Bytes `json:"last_signbytes,omitempty"` // so we dont lose signatures
|
||||
|
||||
// mutable state to be persisted to disk
|
||||
// after each signature to prevent double signing
|
||||
mtx sync.Mutex
|
||||
Info LastSignedInfo `json:"info"`
|
||||
// PrivKey should be empty if a Signer other than the default is being used.
|
||||
PrivKey crypto.PrivKey `json:"priv_key"`
|
||||
Signer `json:"-"`
|
||||
|
||||
// For persistence.
|
||||
// Overloaded for testing.
|
||||
filePath string
|
||||
mtx sync.Mutex
|
||||
}
|
||||
|
||||
// Address returns the address of the validator.
|
||||
// GetAddress returns the address of the validator.
|
||||
// Implements PrivValidator.
|
||||
func (pv *PrivValidatorFS) Address() data.Bytes {
|
||||
return pv.ID.Address
|
||||
func (pv *PrivValidatorFS) GetAddress() data.Bytes {
|
||||
return pv.Address
|
||||
}
|
||||
|
||||
// PubKey returns the public key of the validator.
|
||||
// GetPubKey returns the public key of the validator.
|
||||
// Implements PrivValidator.
|
||||
func (pv *PrivValidatorFS) PubKey() crypto.PubKey {
|
||||
return pv.ID.PubKey
|
||||
func (pv *PrivValidatorFS) GetPubKey() crypto.PubKey {
|
||||
return pv.PubKey
|
||||
}
|
||||
|
||||
// SignVote signs a canonical representation of the vote, along with the chainID.
|
||||
@@ -79,12 +84,10 @@ func (pv *PrivValidatorFS) PubKey() crypto.PubKey {
|
||||
func (privVal *PrivValidatorFS) SignVote(chainID string, vote *Vote) error {
|
||||
privVal.mtx.Lock()
|
||||
defer privVal.mtx.Unlock()
|
||||
signature, err := privVal.Info.SignBytesHRS(privVal.Signer,
|
||||
vote.Height, vote.Round, voteToStep(vote), SignBytes(chainID, vote))
|
||||
signature, err := privVal.signBytesHRS(vote.Height, vote.Round, voteToStep(vote), SignBytes(chainID, vote))
|
||||
if err != nil {
|
||||
return errors.New(cmn.Fmt("Error signing vote: %v", err))
|
||||
}
|
||||
privVal.save()
|
||||
vote.Signature = signature
|
||||
return nil
|
||||
}
|
||||
@@ -94,12 +97,10 @@ func (privVal *PrivValidatorFS) SignVote(chainID string, vote *Vote) error {
|
||||
func (privVal *PrivValidatorFS) SignProposal(chainID string, proposal *Proposal) error {
|
||||
privVal.mtx.Lock()
|
||||
defer privVal.mtx.Unlock()
|
||||
signature, err := privVal.Info.SignBytesHRS(privVal.Signer,
|
||||
proposal.Height, proposal.Round, stepPropose, SignBytes(chainID, proposal))
|
||||
signature, err := privVal.signBytesHRS(proposal.Height, proposal.Round, stepPropose, SignBytes(chainID, proposal))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error signing proposal: %v", err)
|
||||
}
|
||||
privVal.save()
|
||||
proposal.Signature = signature
|
||||
return nil
|
||||
}
|
||||
@@ -137,45 +138,75 @@ func (privVal *PrivValidatorFS) save() {
|
||||
}
|
||||
}
|
||||
|
||||
// UnmarshalJSON unmarshals the given jsonString
|
||||
// into a PrivValidatorFS using a DefaultSigner.
|
||||
func (pv *PrivValidatorFS) UnmarshalJSON(jsonString []byte) error {
|
||||
idAndInfo := &struct {
|
||||
ID ValidatorID `json:"id"`
|
||||
Info LastSignedInfo `json:"info"`
|
||||
}{}
|
||||
if err := json.Unmarshal(jsonString, idAndInfo); err != nil {
|
||||
return err
|
||||
// signBytesHRS signs the given signBytes if the height/round/step (HRS)
|
||||
// are greater than the latest state. If the HRS are equal,
|
||||
// it returns the privValidator.LastSignature.
|
||||
func (privVal *PrivValidatorFS) signBytesHRS(height, round int, step int8, signBytes []byte) (crypto.Signature, error) {
|
||||
|
||||
sig := crypto.Signature{}
|
||||
// If height regression, err
|
||||
if privVal.LastHeight > height {
|
||||
return sig, errors.New("Height regression")
|
||||
}
|
||||
// More cases for when the height matches
|
||||
if privVal.LastHeight == height {
|
||||
// If round regression, err
|
||||
if privVal.LastRound > round {
|
||||
return sig, errors.New("Round regression")
|
||||
}
|
||||
// If step regression, err
|
||||
if privVal.LastRound == round {
|
||||
if privVal.LastStep > step {
|
||||
return sig, errors.New("Step regression")
|
||||
} else if privVal.LastStep == step {
|
||||
if privVal.LastSignBytes != nil {
|
||||
if privVal.LastSignature.Empty() {
|
||||
cmn.PanicSanity("privVal: LastSignature is nil but LastSignBytes is not!")
|
||||
}
|
||||
// so we dont sign a conflicting vote or proposal
|
||||
// NOTE: proposals are non-deterministic (include time),
|
||||
// so we can actually lose them, but will still never sign conflicting ones
|
||||
if bytes.Equal(privVal.LastSignBytes, signBytes) {
|
||||
// log.Notice("Using privVal.LastSignature", "sig", privVal.LastSignature)
|
||||
return privVal.LastSignature, nil
|
||||
}
|
||||
}
|
||||
return sig, errors.New("Step regression")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
signer := &struct {
|
||||
Signer *DefaultSigner `json:"signer"`
|
||||
}{}
|
||||
if err := json.Unmarshal(jsonString, signer); err != nil {
|
||||
return err
|
||||
// Sign
|
||||
sig, err := privVal.Signer.Sign(signBytes)
|
||||
if err != nil {
|
||||
return sig, err
|
||||
}
|
||||
|
||||
pv.ID = idAndInfo.ID
|
||||
pv.Info = idAndInfo.Info
|
||||
pv.Signer = signer.Signer
|
||||
return nil
|
||||
// Persist height/round/step
|
||||
privVal.LastHeight = height
|
||||
privVal.LastRound = round
|
||||
privVal.LastStep = step
|
||||
privVal.LastSignature = sig
|
||||
privVal.LastSignBytes = signBytes
|
||||
privVal.save()
|
||||
|
||||
return sig, nil
|
||||
}
|
||||
|
||||
// Reset resets all fields in the PrivValidatorFS.Info.
|
||||
// Reset resets all fields in the PrivValidatorFS.
|
||||
// NOTE: Unsafe!
|
||||
func (privVal *PrivValidatorFS) Reset() {
|
||||
privVal.Info.LastHeight = 0
|
||||
privVal.Info.LastRound = 0
|
||||
privVal.Info.LastStep = 0
|
||||
privVal.Info.LastSignature = crypto.Signature{}
|
||||
privVal.Info.LastSignBytes = nil
|
||||
privVal.LastHeight = 0
|
||||
privVal.LastRound = 0
|
||||
privVal.LastStep = 0
|
||||
privVal.LastSignature = crypto.Signature{}
|
||||
privVal.LastSignBytes = nil
|
||||
privVal.Save()
|
||||
}
|
||||
|
||||
// String returns a string representation of the PrivValidatorFS.
|
||||
func (privVal *PrivValidatorFS) String() string {
|
||||
info := privVal.Info
|
||||
return fmt.Sprintf("PrivValidator{%v LH:%v, LR:%v, LS:%v}", privVal.Address(), info.LastHeight, info.LastRound, info.LastStep)
|
||||
return fmt.Sprintf("PrivValidator{%v LH:%v, LR:%v, LS:%v}", privVal.GetAddress(), privVal.LastHeight, privVal.LastRound, privVal.LastStep)
|
||||
}
|
||||
|
||||
// LoadOrGenPrivValidatorFS loads a PrivValidatorFS from the given filePath
|
||||
@@ -204,6 +235,7 @@ func LoadPrivValidatorFS(filePath string) *PrivValidatorFS {
|
||||
}
|
||||
|
||||
privVal.filePath = filePath
|
||||
privVal.Signer = NewDefaultSigner(privVal.PrivKey)
|
||||
return &privVal
|
||||
}
|
||||
|
||||
@@ -212,10 +244,10 @@ func LoadPrivValidatorFS(filePath string) *PrivValidatorFS {
|
||||
func GenPrivValidatorFS(filePath string) *PrivValidatorFS {
|
||||
privKey := crypto.GenPrivKeyEd25519().Wrap()
|
||||
return &PrivValidatorFS{
|
||||
ID: ValidatorID{privKey.PubKey().Address(), privKey.PubKey()},
|
||||
Info: LastSignedInfo{
|
||||
LastStep: stepNone,
|
||||
},
|
||||
Address: privKey.PubKey().Address(),
|
||||
PubKey: privKey.PubKey(),
|
||||
PrivKey: privKey,
|
||||
LastStep: stepNone,
|
||||
Signer: NewDefaultSigner(privKey),
|
||||
filePath: filePath,
|
||||
}
|
||||
@@ -225,7 +257,7 @@ func GenPrivValidatorFS(filePath string) *PrivValidatorFS {
|
||||
// signer object. The PrivValidatorFS handles double signing prevention by persisting
|
||||
// data to the filePath, while the Signer handles the signing.
|
||||
// If the filePath does not exist, the PrivValidatorFS must be created manually and saved.
|
||||
func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(ValidatorID) Signer) *PrivValidatorFS {
|
||||
func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(crypto.PubKey) Signer) *PrivValidatorFS {
|
||||
privValJSONBytes, err := ioutil.ReadFile(filePath)
|
||||
if err != nil {
|
||||
cmn.Exit(err.Error())
|
||||
@@ -237,85 +269,12 @@ func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(ValidatorID)
|
||||
}
|
||||
|
||||
privVal.filePath = filePath
|
||||
privVal.Signer = signerFunc(privVal.ID)
|
||||
privVal.Signer = signerFunc(privVal.PubKey)
|
||||
return &privVal
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
// ValidatorID contains the identity of the validator.
|
||||
type ValidatorID struct {
|
||||
Address data.Bytes `json:"address"`
|
||||
PubKey crypto.PubKey `json:"pub_key"`
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
// LastSignedInfo contains information about the latest
|
||||
// data signed by a validator to help prevent double signing.
|
||||
type LastSignedInfo struct {
|
||||
LastHeight int `json:"last_height"`
|
||||
LastRound int `json:"last_round"`
|
||||
LastStep int8 `json:"last_step"`
|
||||
LastSignature crypto.Signature `json:"last_signature,omitempty"` // so we dont lose signatures
|
||||
LastSignBytes data.Bytes `json:"last_signbytes,omitempty"` // so we dont lose signatures
|
||||
}
|
||||
|
||||
// SignBytesHRS signs the given signBytes with the signer if the height/round/step (HRS)
|
||||
// are greater than the latest state of the LastSignedInfo. If the HRS are equal,
|
||||
// it returns the LastSignedInfo.LastSignature.
|
||||
func (info *LastSignedInfo) SignBytesHRS(signer Signer,
|
||||
height, round int, step int8, signBytes []byte) (crypto.Signature, error) {
|
||||
|
||||
sig := crypto.Signature{}
|
||||
// If height regression, err
|
||||
if info.LastHeight > height {
|
||||
return sig, errors.New("Height regression")
|
||||
}
|
||||
// More cases for when the height matches
|
||||
if info.LastHeight == height {
|
||||
// If round regression, err
|
||||
if info.LastRound > round {
|
||||
return sig, errors.New("Round regression")
|
||||
}
|
||||
// If step regression, err
|
||||
if info.LastRound == round {
|
||||
if info.LastStep > step {
|
||||
return sig, errors.New("Step regression")
|
||||
} else if info.LastStep == step {
|
||||
if info.LastSignBytes != nil {
|
||||
if info.LastSignature.Empty() {
|
||||
cmn.PanicSanity("privVal: LastSignature is nil but LastSignBytes is not!")
|
||||
}
|
||||
// so we dont sign a conflicting vote or proposal
|
||||
// NOTE: proposals are non-deterministic (include time),
|
||||
// so we can actually lose them, but will still never sign conflicting ones
|
||||
if bytes.Equal(info.LastSignBytes, signBytes) {
|
||||
// log.Notice("Using info.LastSignature", "sig", info.LastSignature)
|
||||
return info.LastSignature, nil
|
||||
}
|
||||
}
|
||||
return sig, errors.New("Step regression")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sign
|
||||
sig, err := signer.Sign(signBytes)
|
||||
if err != nil {
|
||||
return sig, err
|
||||
}
|
||||
|
||||
// Persist height/round/step
|
||||
info.LastHeight = height
|
||||
info.LastRound = round
|
||||
info.LastStep = step
|
||||
info.LastSignature = sig
|
||||
info.LastSignBytes = signBytes
|
||||
|
||||
return sig, nil
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
|
||||
// Signer is an interface that defines how to sign messages.
|
||||
@@ -353,7 +312,7 @@ func (pvs PrivValidatorsByAddress) Len() int {
|
||||
}
|
||||
|
||||
func (pvs PrivValidatorsByAddress) Less(i, j int) bool {
|
||||
return bytes.Compare(pvs[i].Address(), pvs[j].Address()) == -1
|
||||
return bytes.Compare(pvs[i].GetAddress(), pvs[j].GetAddress()) == -1
|
||||
}
|
||||
|
||||
func (pvs PrivValidatorsByAddress) Swap(i, j int) {
|
||||
|
@@ -29,25 +29,19 @@ func TestLoadValidator(t *testing.T) {
|
||||
require.Nil(err, "%+v", err)
|
||||
|
||||
serialized := fmt.Sprintf(`{
|
||||
"id": {
|
||||
"address": "%s",
|
||||
"pub_key": {
|
||||
"type": "ed25519",
|
||||
"data": "%s"
|
||||
}
|
||||
},
|
||||
"info": {
|
||||
},
|
||||
"last_height": 0,
|
||||
"last_round": 0,
|
||||
"last_step": 0,
|
||||
"last_signature": null
|
||||
},
|
||||
"signer": {
|
||||
"last_signature": null,
|
||||
"priv_key": {
|
||||
"type": "ed25519",
|
||||
"data": "%s"
|
||||
}
|
||||
}
|
||||
}`, addrStr, pubStr, privStr)
|
||||
|
||||
val := PrivValidatorFS{}
|
||||
@@ -55,10 +49,9 @@ func TestLoadValidator(t *testing.T) {
|
||||
require.Nil(err, "%+v", err)
|
||||
|
||||
// make sure the values match
|
||||
assert.EqualValues(addrBytes, val.Address())
|
||||
assert.EqualValues(pubKey, val.PubKey())
|
||||
valPrivKey := val.Signer.(*DefaultSigner).PrivKey
|
||||
assert.EqualValues(privKey, valPrivKey)
|
||||
assert.EqualValues(addrBytes, val.GetAddress())
|
||||
assert.EqualValues(pubKey, val.GetPubKey())
|
||||
assert.EqualValues(privKey, val.PrivKey)
|
||||
|
||||
// export it and make sure it is the same
|
||||
out, err := json.Marshal(val)
|
||||
|
@@ -38,7 +38,7 @@ func BenchmarkProposalVerifySignature(b *testing.B) {
|
||||
signBytes := SignBytes("test_chain_id", testProposal)
|
||||
privVal := GenPrivValidatorFS("")
|
||||
signature, _ := privVal.Signer.Sign(signBytes)
|
||||
pubKey := privVal.PubKey()
|
||||
pubKey := privVal.GetPubKey()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
pubKey.VerifyBytes(SignBytes("test_chain_id", testProposal), signature)
|
||||
|
@@ -113,6 +113,6 @@ func RandValidator(randPower bool, minPower int64) (*Validator, *PrivValidatorFS
|
||||
if randPower {
|
||||
votePower += int64(cmn.RandUint32())
|
||||
}
|
||||
val := NewValidator(privVal.PubKey(), votePower)
|
||||
val := NewValidator(privVal.GetPubKey(), votePower)
|
||||
return val, privVal
|
||||
}
|
||||
|
@@ -76,7 +76,7 @@ func TestAddVote(t *testing.T) {
|
||||
|
||||
// t.Logf(">> %v", voteSet)
|
||||
|
||||
if voteSet.GetByAddress(val0.Address()) != nil {
|
||||
if voteSet.GetByAddress(val0.GetAddress()) != nil {
|
||||
t.Errorf("Expected GetByAddress(val0.Address) to be nil")
|
||||
}
|
||||
if voteSet.BitArray().GetIndex(0) {
|
||||
@@ -88,7 +88,7 @@ func TestAddVote(t *testing.T) {
|
||||
}
|
||||
|
||||
vote := &Vote{
|
||||
ValidatorAddress: val0.Address(),
|
||||
ValidatorAddress: val0.GetAddress(),
|
||||
ValidatorIndex: 0, // since privValidators are in order
|
||||
Height: height,
|
||||
Round: round,
|
||||
@@ -100,7 +100,7 @@ func TestAddVote(t *testing.T) {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if voteSet.GetByAddress(val0.Address()) == nil {
|
||||
if voteSet.GetByAddress(val0.GetAddress()) == nil {
|
||||
t.Errorf("Expected GetByAddress(val0.Address) to be present")
|
||||
}
|
||||
if !voteSet.BitArray().GetIndex(0) {
|
||||
@@ -126,7 +126,7 @@ func Test2_3Majority(t *testing.T) {
|
||||
}
|
||||
// 6 out of 10 voted for nil.
|
||||
for i := 0; i < 6; i++ {
|
||||
vote := withValidator(voteProto, privValidators[i].Address(), i)
|
||||
vote := withValidator(voteProto, privValidators[i].GetAddress(), i)
|
||||
signAddVote(privValidators[i], vote, voteSet)
|
||||
}
|
||||
blockID, ok := voteSet.TwoThirdsMajority()
|
||||
@@ -136,7 +136,7 @@ func Test2_3Majority(t *testing.T) {
|
||||
|
||||
// 7th validator voted for some blockhash
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[6].Address(), 6)
|
||||
vote := withValidator(voteProto, privValidators[6].GetAddress(), 6)
|
||||
signAddVote(privValidators[6], withBlockHash(vote, RandBytes(32)), voteSet)
|
||||
blockID, ok = voteSet.TwoThirdsMajority()
|
||||
if ok || !blockID.IsZero() {
|
||||
@@ -146,7 +146,7 @@ func Test2_3Majority(t *testing.T) {
|
||||
|
||||
// 8th validator voted for nil.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[7].Address(), 7)
|
||||
vote := withValidator(voteProto, privValidators[7].GetAddress(), 7)
|
||||
signAddVote(privValidators[7], vote, voteSet)
|
||||
blockID, ok = voteSet.TwoThirdsMajority()
|
||||
if !ok || !blockID.IsZero() {
|
||||
@@ -174,7 +174,7 @@ func Test2_3MajorityRedux(t *testing.T) {
|
||||
|
||||
// 66 out of 100 voted for nil.
|
||||
for i := 0; i < 66; i++ {
|
||||
vote := withValidator(voteProto, privValidators[i].Address(), i)
|
||||
vote := withValidator(voteProto, privValidators[i].GetAddress(), i)
|
||||
signAddVote(privValidators[i], vote, voteSet)
|
||||
}
|
||||
blockID, ok := voteSet.TwoThirdsMajority()
|
||||
@@ -184,7 +184,7 @@ func Test2_3MajorityRedux(t *testing.T) {
|
||||
|
||||
// 67th validator voted for nil
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[66].Address(), 66)
|
||||
vote := withValidator(voteProto, privValidators[66].GetAddress(), 66)
|
||||
signAddVote(privValidators[66], withBlockHash(vote, nil), voteSet)
|
||||
blockID, ok = voteSet.TwoThirdsMajority()
|
||||
if ok || !blockID.IsZero() {
|
||||
@@ -194,7 +194,7 @@ func Test2_3MajorityRedux(t *testing.T) {
|
||||
|
||||
// 68th validator voted for a different BlockParts PartSetHeader
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[67].Address(), 67)
|
||||
vote := withValidator(voteProto, privValidators[67].GetAddress(), 67)
|
||||
blockPartsHeader := PartSetHeader{blockPartsTotal, crypto.CRandBytes(32)}
|
||||
signAddVote(privValidators[67], withBlockPartsHeader(vote, blockPartsHeader), voteSet)
|
||||
blockID, ok = voteSet.TwoThirdsMajority()
|
||||
@@ -205,7 +205,7 @@ func Test2_3MajorityRedux(t *testing.T) {
|
||||
|
||||
// 69th validator voted for different BlockParts Total
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[68].Address(), 68)
|
||||
vote := withValidator(voteProto, privValidators[68].GetAddress(), 68)
|
||||
blockPartsHeader := PartSetHeader{blockPartsTotal + 1, blockPartsHeader.Hash}
|
||||
signAddVote(privValidators[68], withBlockPartsHeader(vote, blockPartsHeader), voteSet)
|
||||
blockID, ok = voteSet.TwoThirdsMajority()
|
||||
@@ -216,7 +216,7 @@ func Test2_3MajorityRedux(t *testing.T) {
|
||||
|
||||
// 70th validator voted for different BlockHash
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[69].Address(), 69)
|
||||
vote := withValidator(voteProto, privValidators[69].GetAddress(), 69)
|
||||
signAddVote(privValidators[69], withBlockHash(vote, RandBytes(32)), voteSet)
|
||||
blockID, ok = voteSet.TwoThirdsMajority()
|
||||
if ok || !blockID.IsZero() {
|
||||
@@ -226,7 +226,7 @@ func Test2_3MajorityRedux(t *testing.T) {
|
||||
|
||||
// 71st validator voted for the right BlockHash & BlockPartsHeader
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[70].Address(), 70)
|
||||
vote := withValidator(voteProto, privValidators[70].GetAddress(), 70)
|
||||
signAddVote(privValidators[70], vote, voteSet)
|
||||
blockID, ok = voteSet.TwoThirdsMajority()
|
||||
if !ok || !blockID.Equals(BlockID{blockHash, blockPartsHeader}) {
|
||||
@@ -250,7 +250,7 @@ func TestBadVotes(t *testing.T) {
|
||||
|
||||
// val0 votes for nil.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[0].Address(), 0)
|
||||
vote := withValidator(voteProto, privValidators[0].GetAddress(), 0)
|
||||
added, err := signAddVote(privValidators[0], vote, voteSet)
|
||||
if !added || err != nil {
|
||||
t.Errorf("Expected VoteSet.Add to succeed")
|
||||
@@ -259,7 +259,7 @@ func TestBadVotes(t *testing.T) {
|
||||
|
||||
// val0 votes again for some block.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[0].Address(), 0)
|
||||
vote := withValidator(voteProto, privValidators[0].GetAddress(), 0)
|
||||
added, err := signAddVote(privValidators[0], withBlockHash(vote, RandBytes(32)), voteSet)
|
||||
if added || err == nil {
|
||||
t.Errorf("Expected VoteSet.Add to fail, conflicting vote.")
|
||||
@@ -268,7 +268,7 @@ func TestBadVotes(t *testing.T) {
|
||||
|
||||
// val1 votes on another height
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[1].Address(), 1)
|
||||
vote := withValidator(voteProto, privValidators[1].GetAddress(), 1)
|
||||
added, err := signAddVote(privValidators[1], withHeight(vote, height+1), voteSet)
|
||||
if added || err == nil {
|
||||
t.Errorf("Expected VoteSet.Add to fail, wrong height")
|
||||
@@ -277,7 +277,7 @@ func TestBadVotes(t *testing.T) {
|
||||
|
||||
// val2 votes on another round
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[2].Address(), 2)
|
||||
vote := withValidator(voteProto, privValidators[2].GetAddress(), 2)
|
||||
added, err := signAddVote(privValidators[2], withRound(vote, round+1), voteSet)
|
||||
if added || err == nil {
|
||||
t.Errorf("Expected VoteSet.Add to fail, wrong round")
|
||||
@@ -286,7 +286,7 @@ func TestBadVotes(t *testing.T) {
|
||||
|
||||
// val3 votes of another type.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[3].Address(), 3)
|
||||
vote := withValidator(voteProto, privValidators[3].GetAddress(), 3)
|
||||
added, err := signAddVote(privValidators[3], withType(vote, VoteTypePrecommit), voteSet)
|
||||
if added || err == nil {
|
||||
t.Errorf("Expected VoteSet.Add to fail, wrong type")
|
||||
@@ -311,7 +311,7 @@ func TestConflicts(t *testing.T) {
|
||||
|
||||
// val0 votes for nil.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[0].Address(), 0)
|
||||
vote := withValidator(voteProto, privValidators[0].GetAddress(), 0)
|
||||
added, err := signAddVote(privValidators[0], vote, voteSet)
|
||||
if !added || err != nil {
|
||||
t.Errorf("Expected VoteSet.Add to succeed")
|
||||
@@ -320,7 +320,7 @@ func TestConflicts(t *testing.T) {
|
||||
|
||||
// val0 votes again for blockHash1.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[0].Address(), 0)
|
||||
vote := withValidator(voteProto, privValidators[0].GetAddress(), 0)
|
||||
added, err := signAddVote(privValidators[0], withBlockHash(vote, blockHash1), voteSet)
|
||||
if added {
|
||||
t.Errorf("Expected VoteSet.Add to fail, conflicting vote.")
|
||||
@@ -335,7 +335,7 @@ func TestConflicts(t *testing.T) {
|
||||
|
||||
// val0 votes again for blockHash1.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[0].Address(), 0)
|
||||
vote := withValidator(voteProto, privValidators[0].GetAddress(), 0)
|
||||
added, err := signAddVote(privValidators[0], withBlockHash(vote, blockHash1), voteSet)
|
||||
if !added {
|
||||
t.Errorf("Expected VoteSet.Add to succeed, called SetPeerMaj23().")
|
||||
@@ -350,7 +350,7 @@ func TestConflicts(t *testing.T) {
|
||||
|
||||
// val0 votes again for blockHash1.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[0].Address(), 0)
|
||||
vote := withValidator(voteProto, privValidators[0].GetAddress(), 0)
|
||||
added, err := signAddVote(privValidators[0], withBlockHash(vote, blockHash2), voteSet)
|
||||
if added {
|
||||
t.Errorf("Expected VoteSet.Add to fail, duplicate SetPeerMaj23() from peerA")
|
||||
@@ -362,7 +362,7 @@ func TestConflicts(t *testing.T) {
|
||||
|
||||
// val1 votes for blockHash1.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[1].Address(), 1)
|
||||
vote := withValidator(voteProto, privValidators[1].GetAddress(), 1)
|
||||
added, err := signAddVote(privValidators[1], withBlockHash(vote, blockHash1), voteSet)
|
||||
if !added || err != nil {
|
||||
t.Errorf("Expected VoteSet.Add to succeed")
|
||||
@@ -379,7 +379,7 @@ func TestConflicts(t *testing.T) {
|
||||
|
||||
// val2 votes for blockHash2.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[2].Address(), 2)
|
||||
vote := withValidator(voteProto, privValidators[2].GetAddress(), 2)
|
||||
added, err := signAddVote(privValidators[2], withBlockHash(vote, blockHash2), voteSet)
|
||||
if !added || err != nil {
|
||||
t.Errorf("Expected VoteSet.Add to succeed")
|
||||
@@ -399,7 +399,7 @@ func TestConflicts(t *testing.T) {
|
||||
|
||||
// val2 votes for blockHash1.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[2].Address(), 2)
|
||||
vote := withValidator(voteProto, privValidators[2].GetAddress(), 2)
|
||||
added, err := signAddVote(privValidators[2], withBlockHash(vote, blockHash1), voteSet)
|
||||
if !added {
|
||||
t.Errorf("Expected VoteSet.Add to succeed")
|
||||
@@ -439,7 +439,7 @@ func TestMakeCommit(t *testing.T) {
|
||||
|
||||
// 6 out of 10 voted for some block.
|
||||
for i := 0; i < 6; i++ {
|
||||
vote := withValidator(voteProto, privValidators[i].Address(), i)
|
||||
vote := withValidator(voteProto, privValidators[i].GetAddress(), i)
|
||||
signAddVote(privValidators[i], vote, voteSet)
|
||||
}
|
||||
|
||||
@@ -448,7 +448,7 @@ func TestMakeCommit(t *testing.T) {
|
||||
|
||||
// 7th voted for some other block.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[6].Address(), 6)
|
||||
vote := withValidator(voteProto, privValidators[6].GetAddress(), 6)
|
||||
vote = withBlockHash(vote, RandBytes(32))
|
||||
vote = withBlockPartsHeader(vote, PartSetHeader{123, RandBytes(32)})
|
||||
signAddVote(privValidators[6], vote, voteSet)
|
||||
@@ -456,7 +456,7 @@ func TestMakeCommit(t *testing.T) {
|
||||
|
||||
// The 8th voted like everyone else.
|
||||
{
|
||||
vote := withValidator(voteProto, privValidators[7].Address(), 7)
|
||||
vote := withValidator(voteProto, privValidators[7].GetAddress(), 7)
|
||||
signAddVote(privValidators[7], vote, voteSet)
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user