address comments in progress

This commit is contained in:
mossid 2019-02-08 21:48:41 +01:00
parent 29a7bea364
commit f89daec13e
5 changed files with 23 additions and 16 deletions

View File

@ -44,9 +44,9 @@ func NewPersistentKVStoreApplication(dbDir string) *PersistentKVStoreApplication
state := loadState(db) state := loadState(db)
return &PersistentKVStoreApplication{ return &PersistentKVStoreApplication{
app: &KVStoreApplication{state: state}, app: &KVStoreApplication{state: state},
relation: make(map[string]types.PubKey), valAddrToPubKeyMap: make(map[string]types.PubKey),
logger: log.NewNopLogger(), logger: log.NewNopLogger(),
} }
} }
@ -122,8 +122,11 @@ func (app *PersistentKVStoreApplication) BeginBlock(req types.RequestBeginBlock)
switch ev.Type { switch ev.Type {
case tmtypes.ABCIEvidenceTypeDuplicateVote: case tmtypes.ABCIEvidenceTypeDuplicateVote:
// decrease voting power by 1 // decrease voting power by 1
if ev.TotalVotingPower == 0 {
continue
}
app.updateValidator(types.ValidatorUpdate{ app.updateValidator(types.ValidatorUpdate{
PubKey: app.relation[string(ev.Validator.Address)], PubKey: app.valAddrToPubKeyMap[string(ev.Validator.Address)],
Power: ev.TotalVotingPower - 1, Power: ev.TotalVotingPower - 1,
}) })
} }
@ -212,7 +215,7 @@ func (app *PersistentKVStoreApplication) updateValidator(v types.ValidatorUpdate
} }
app.app.state.db.Delete(key) app.app.state.db.Delete(key)
delete(app.relation, string(pubkey.Address())) delete(app.valAddrToPubKeyMap, string(pubkey.Address()))
} else { } else {
// add or update validator // add or update validator
@ -224,7 +227,7 @@ func (app *PersistentKVStoreApplication) updateValidator(v types.ValidatorUpdate
} }
app.app.state.db.Set(key, value.Bytes()) app.app.state.db.Set(key, value.Bytes())
app.relation[string(pubkey.Address())] = v.PubKey app.valAddrToPubKeyMap[string(pubkey.Address())] = v.PubKey
} }
// we only update the changes array if we successfully updated the tree // we only update the changes array if we successfully updated the tree

View File

@ -52,7 +52,6 @@ type SignClient interface {
Validators(height *int64) (*ctypes.ResultValidators, error) Validators(height *int64) (*ctypes.ResultValidators, error)
Tx(hash []byte, prove bool) (*ctypes.ResultTx, error) Tx(hash []byte, prove bool) (*ctypes.ResultTx, error)
TxSearch(query string, prove bool, page, perPage int) (*ctypes.ResultTxSearch, error) TxSearch(query string, prove bool, page, perPage int) (*ctypes.ResultTxSearch, error)
BroadcastDuplicateVote(pubkey crypto.PubKey, vote1 types.Vote, vote2 types.Vote) (*ctypes.ResultBroadcastDuplicateVote, error)
} }
// HistoryClient shows us data from genesis to now in large chunks. // HistoryClient shows us data from genesis to now in large chunks.
@ -76,6 +75,7 @@ type Client interface {
HistoryClient HistoryClient
StatusClient StatusClient
EventsClient EventsClient
EvidenceClient
} }
// NetworkClient is general info about the network state. May not // NetworkClient is general info about the network state. May not
@ -101,3 +101,8 @@ type MempoolClient interface {
UnconfirmedTxs(limit int) (*ctypes.ResultUnconfirmedTxs, error) UnconfirmedTxs(limit int) (*ctypes.ResultUnconfirmedTxs, error)
NumUnconfirmedTxs() (*ctypes.ResultUnconfirmedTxs, error) NumUnconfirmedTxs() (*ctypes.ResultUnconfirmedTxs, error)
} }
// EvidenceClient is used for submitting evidence for malicious behaviours
type EvidenceClient interface {
BroadcastDuplicateVote(pubkey crypto.PubKey, vote1 types.Vote, vote2 types.Vote) (*ctypes.ResultBroadcastDuplicateVote, error)
}

View File

@ -35,6 +35,7 @@ type Client struct {
client.HistoryClient client.HistoryClient
client.StatusClient client.StatusClient
client.EventsClient client.EventsClient
client.EvidenceClient
cmn.Service cmn.Service
} }
@ -134,3 +135,7 @@ func (c Client) Commit(height *int64) (*ctypes.ResultCommit, error) {
func (c Client) Validators(height *int64) (*ctypes.ResultValidators, error) { func (c Client) Validators(height *int64) (*ctypes.ResultValidators, error) {
return core.Validators(height) return core.Validators(height)
} }
func (c Client) BroadcastEvidence(pubkey crypto.PubKey, vote1, vote2 types.Vote) (*ctypes.ResultBroadcastDuplicateVote, error) {
return core.BroadcastDuplicateVote(pubkey, vote1, vote2)
}

View File

@ -567,7 +567,8 @@ func TestBroadcastDuplicateVote(t *testing.T) {
for _, fake := range fakes { for _, fake := range fakes {
_, err := c.BroadcastDuplicateVote(fake.PubKey, *fake.VoteA, *fake.VoteB) _, err := c.BroadcastDuplicateVote(fake.PubKey, *fake.VoteA, *fake.VoteB)
require.Error(t, err, "Broadcasting fake evidence succeed", fake.String()) require.Error(t, err, "Broadcasting fake evidence succeed: %s", fake.String())
require.True(t, strings.HasPrefix(err.Error(), "Error broadcasting evidence, adding evidence"), "Broadcasting fake evidence failed on HTTP call: %s", fake.String())
} }
} }

View File

@ -8,7 +8,7 @@ import (
"github.com/tendermint/tendermint/types" "github.com/tendermint/tendermint/types"
) )
// ### Query Parameters // ### Broadcast Duplicate Vote Parameters
// //
// | Parameter | Type | Default | Required | Description | // | Parameter | Type | Default | Required | Description |
// |-----------+--------+---------+----------+-------------------------------| // |-----------+--------+---------+----------+-------------------------------|
@ -16,14 +16,7 @@ import (
// | vote1 | Vote | nil | true | First vote | // | vote1 | Vote | nil | true | First vote |
// | vote2 | Vote | nil | true | Second vote | // | vote2 | Vote | nil | true | Second vote |
func BroadcastDuplicateVote(pubkey crypto.PubKey, vote1 types.Vote, vote2 types.Vote) (*ctypes.ResultBroadcastDuplicateVote, error) { func BroadcastDuplicateVote(pubkey crypto.PubKey, vote1 types.Vote, vote2 types.Vote) (*ctypes.ResultBroadcastDuplicateVote, error) {
chainID := p2pTransport.NodeInfo().Network
ev := &types.DuplicateVoteEvidence{pubkey, &vote1, &vote2} ev := &types.DuplicateVoteEvidence{pubkey, &vote1, &vote2}
if err := vote1.Verify(chainID, pubkey); err != nil {
return nil, fmt.Errorf("Error broadcasting evidence, invalid vote1: %v", err)
}
if err := vote2.Verify(chainID, pubkey); err != nil {
return nil, fmt.Errorf("Error broadcasting evidence, invalid vote2: %v", err)
}
err := evidencePool.AddEvidence(ev) err := evidencePool.AddEvidence(ev)
if err != nil { if err != nil {