mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-08 11:01:20 +00:00
Fix evidence
This commit is contained in:
parent
1b9323f105
commit
5d1c758730
@ -1,14 +1,12 @@
|
|||||||
package evidence
|
package evidence
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/tendermint/go-amino"
|
||||||
|
"github.com/tendermint/tmlibs/log"
|
||||||
"reflect"
|
"reflect"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
wire "github.com/tendermint/go-wire"
|
|
||||||
"github.com/tendermint/tmlibs/log"
|
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/p2p"
|
"github.com/tendermint/tendermint/p2p"
|
||||||
"github.com/tendermint/tendermint/types"
|
"github.com/tendermint/tendermint/types"
|
||||||
)
|
)
|
||||||
@ -68,7 +66,7 @@ func (evR *EvidenceReactor) AddPeer(peer p2p.Peer) {
|
|||||||
// the rest will be sent by the broadcastRoutine
|
// the rest will be sent by the broadcastRoutine
|
||||||
evidences := evR.evpool.PriorityEvidence()
|
evidences := evR.evpool.PriorityEvidence()
|
||||||
msg := &EvidenceListMessage{evidences}
|
msg := &EvidenceListMessage{evidences}
|
||||||
success := peer.Send(EvidenceChannel, struct{ EvidenceMessage }{msg})
|
success := peer.Send(EvidenceChannel, cdc.MustMarshalBinaryBare(msg))
|
||||||
if !success {
|
if !success {
|
||||||
// TODO: remove peer ?
|
// TODO: remove peer ?
|
||||||
}
|
}
|
||||||
@ -82,7 +80,7 @@ func (evR *EvidenceReactor) RemovePeer(peer p2p.Peer, reason interface{}) {
|
|||||||
// Receive implements Reactor.
|
// Receive implements Reactor.
|
||||||
// It adds any received evidence to the evpool.
|
// It adds any received evidence to the evpool.
|
||||||
func (evR *EvidenceReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte) {
|
func (evR *EvidenceReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte) {
|
||||||
_, msg, err := DecodeMessage(msgBytes)
|
msg, err := DecodeMessage(msgBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
evR.Logger.Error("Error decoding message", "src", src, "chId", chID, "msg", msg, "err", err, "bytes", msgBytes)
|
evR.Logger.Error("Error decoding message", "src", src, "chId", chID, "msg", msg, "err", err, "bytes", msgBytes)
|
||||||
evR.Switch.StopPeerForError(src, err)
|
evR.Switch.StopPeerForError(src, err)
|
||||||
@ -119,7 +117,7 @@ func (evR *EvidenceReactor) broadcastRoutine() {
|
|||||||
case evidence := <-evR.evpool.EvidenceChan():
|
case evidence := <-evR.evpool.EvidenceChan():
|
||||||
// broadcast some new evidence
|
// broadcast some new evidence
|
||||||
msg := &EvidenceListMessage{[]types.Evidence{evidence}}
|
msg := &EvidenceListMessage{[]types.Evidence{evidence}}
|
||||||
evR.Switch.Broadcast(EvidenceChannel, struct{ EvidenceMessage }{msg})
|
evR.Switch.Broadcast(EvidenceChannel, cdc.MustMarshalBinaryBare(msg))
|
||||||
|
|
||||||
// TODO: Broadcast runs asynchronously, so this should wait on the successChan
|
// TODO: Broadcast runs asynchronously, so this should wait on the successChan
|
||||||
// in another routine before marking to be proper.
|
// in another routine before marking to be proper.
|
||||||
@ -127,7 +125,7 @@ func (evR *EvidenceReactor) broadcastRoutine() {
|
|||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
// broadcast all pending evidence
|
// broadcast all pending evidence
|
||||||
msg := &EvidenceListMessage{evR.evpool.PendingEvidence()}
|
msg := &EvidenceListMessage{evR.evpool.PendingEvidence()}
|
||||||
evR.Switch.Broadcast(EvidenceChannel, struct{ EvidenceMessage }{msg})
|
evR.Switch.Broadcast(EvidenceChannel, cdc.MustMarshalBinaryBare(msg))
|
||||||
case <-evR.Quit():
|
case <-evR.Quit():
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -137,24 +135,18 @@ func (evR *EvidenceReactor) broadcastRoutine() {
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Messages
|
// Messages
|
||||||
|
|
||||||
const (
|
|
||||||
msgTypeEvidence = byte(0x01)
|
|
||||||
)
|
|
||||||
|
|
||||||
// EvidenceMessage is a message sent or received by the EvidenceReactor.
|
// EvidenceMessage is a message sent or received by the EvidenceReactor.
|
||||||
type EvidenceMessage interface{}
|
type EvidenceMessage interface{}
|
||||||
|
|
||||||
var _ = wire.RegisterInterface(
|
func RegisterEvidenceMessages(cdc *amino.Codec) {
|
||||||
struct{ EvidenceMessage }{},
|
cdc.RegisterInterface((*EvidenceMessage)(nil), nil)
|
||||||
wire.ConcreteType{&EvidenceListMessage{}, msgTypeEvidence},
|
cdc.RegisterConcrete(&EvidenceListMessage{},
|
||||||
)
|
"tendermint/evidence/EvidenceListMessagE", nil)
|
||||||
|
}
|
||||||
|
|
||||||
// DecodeMessage decodes a byte-array into a EvidenceMessage.
|
// DecodeMessage decodes a byte-array into a EvidenceMessage.
|
||||||
func DecodeMessage(bz []byte) (msgType byte, msg EvidenceMessage, err error) {
|
func DecodeMessage(bz []byte) (msg EvidenceMessage, err error) {
|
||||||
msgType = bz[0]
|
err = cdc.UnmarshalBinaryBare(bz, &msg)
|
||||||
n := new(int)
|
|
||||||
r := bytes.NewReader(bz)
|
|
||||||
msg = wire.ReadBinary(struct{ EvidenceMessage }{}, r, maxEvidenceMessageSize, n, &err).(struct{ EvidenceMessage }).EvidenceMessage
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ package evidence
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
wire "github.com/tendermint/go-wire"
|
|
||||||
"github.com/tendermint/tendermint/types"
|
"github.com/tendermint/tendermint/types"
|
||||||
dbm "github.com/tendermint/tmlibs/db"
|
dbm "github.com/tendermint/tmlibs/db"
|
||||||
)
|
)
|
||||||
@ -104,7 +103,10 @@ func (store *EvidenceStore) ListEvidence(prefixKey string) (evidence []types.Evi
|
|||||||
val := iter.Value()
|
val := iter.Value()
|
||||||
|
|
||||||
var ei EvidenceInfo
|
var ei EvidenceInfo
|
||||||
wire.ReadBinaryBytes(val, &ei)
|
err := cdc.UnmarshalBinaryBare(val, &ei)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
evidence = append(evidence, ei.Evidence)
|
evidence = append(evidence, ei.Evidence)
|
||||||
}
|
}
|
||||||
return evidence
|
return evidence
|
||||||
@ -119,7 +121,10 @@ func (store *EvidenceStore) GetEvidence(height int64, hash []byte) *EvidenceInfo
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var ei EvidenceInfo
|
var ei EvidenceInfo
|
||||||
wire.ReadBinaryBytes(val, &ei)
|
err := cdc.UnmarshalBinaryBare(val, &ei)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
return &ei
|
return &ei
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +142,7 @@ func (store *EvidenceStore) AddNewEvidence(evidence types.Evidence, priority int
|
|||||||
Priority: priority,
|
Priority: priority,
|
||||||
Evidence: evidence,
|
Evidence: evidence,
|
||||||
}
|
}
|
||||||
eiBytes := wire.BinaryBytes(ei)
|
eiBytes := cdc.MustMarshalBinaryBare(ei)
|
||||||
|
|
||||||
// add it to the store
|
// add it to the store
|
||||||
key := keyOutqueue(evidence, priority)
|
key := keyOutqueue(evidence, priority)
|
||||||
@ -171,7 +176,7 @@ func (store *EvidenceStore) MarkEvidenceAsCommitted(evidence types.Evidence) {
|
|||||||
ei.Committed = true
|
ei.Committed = true
|
||||||
|
|
||||||
lookupKey := keyLookup(evidence)
|
lookupKey := keyLookup(evidence)
|
||||||
store.db.SetSync(lookupKey, wire.BinaryBytes(ei))
|
store.db.SetSync(lookupKey, cdc.MustMarshalBinaryBare(ei))
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------
|
//---------------------------------------------------
|
||||||
@ -181,6 +186,9 @@ func (store *EvidenceStore) getEvidenceInfo(evidence types.Evidence) EvidenceInf
|
|||||||
key := keyLookup(evidence)
|
key := keyLookup(evidence)
|
||||||
var ei EvidenceInfo
|
var ei EvidenceInfo
|
||||||
b := store.db.Get(key)
|
b := store.db.Get(key)
|
||||||
wire.ReadBinaryBytes(b, &ei)
|
err := cdc.UnmarshalBinaryBare(b, &ei)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
return ei
|
return ei
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
wire "github.com/tendermint/go-wire"
|
|
||||||
"github.com/tendermint/tendermint/types"
|
"github.com/tendermint/tendermint/types"
|
||||||
dbm "github.com/tendermint/tmlibs/db"
|
dbm "github.com/tendermint/tmlibs/db"
|
||||||
)
|
)
|
||||||
@ -108,15 +107,3 @@ func TestStorePriority(t *testing.T) {
|
|||||||
assert.Equal(ev, cases[i].ev)
|
assert.Equal(ev, cases[i].ev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------
|
|
||||||
const (
|
|
||||||
evidenceTypeMockGood = byte(0x01)
|
|
||||||
evidenceTypeMockBad = byte(0x02)
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ = wire.RegisterInterface(
|
|
||||||
struct{ types.Evidence }{},
|
|
||||||
wire.ConcreteType{types.MockGoodEvidence{}, evidenceTypeMockGood},
|
|
||||||
wire.ConcreteType{types.MockBadEvidence{}, evidenceTypeMockBad},
|
|
||||||
)
|
|
||||||
|
25
evidence/wire.go
Normal file
25
evidence/wire.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package evidence
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/tendermint/go-amino"
|
||||||
|
"github.com/tendermint/go-crypto"
|
||||||
|
"github.com/tendermint/tendermint/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
var cdc = amino.NewCodec()
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RegisterEvidenceMessages(cdc)
|
||||||
|
crypto.RegisterAmino(cdc)
|
||||||
|
types.RegisterEvidences(cdc)
|
||||||
|
RegisterMockEvidences(cdc) // For testing
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------
|
||||||
|
|
||||||
|
func RegisterMockEvidences(cdc *amino.Codec) {
|
||||||
|
cdc.RegisterConcrete(types.MockGoodEvidence{},
|
||||||
|
"tendermint/MockGoodEvidence", nil)
|
||||||
|
cdc.RegisterConcrete(types.MockBadEvidence{},
|
||||||
|
"tendermint/MockBadEvidence", nil)
|
||||||
|
}
|
@ -238,7 +238,7 @@ func TestPEXReactorUsesSeedsIfNeeded(t *testing.T) {
|
|||||||
defer peer.Stop()
|
defer peer.Stop()
|
||||||
|
|
||||||
// 3. check that the peer connects to seed immediately
|
// 3. check that the peer connects to seed immediately
|
||||||
assertPeersWithTimeout(t, []*p2p.Switch{peer}, 10*time.Millisecond, 1*time.Second, 1)
|
assertPeersWithTimeout(t, []*p2p.Switch{peer}, 10*time.Millisecond, 3*time.Second, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPEXReactorCrawlStatus(t *testing.T) {
|
func TestPEXReactorCrawlStatus(t *testing.T) {
|
||||||
|
@ -38,9 +38,9 @@ type Evidence interface {
|
|||||||
String() string
|
String() string
|
||||||
}
|
}
|
||||||
|
|
||||||
func RegisterEvidence(cdc *amino.Codec) {
|
func RegisterEvidences(cdc *amino.Codec) {
|
||||||
cdc.RegisterInterface((*Evidence)(nil), nil)
|
cdc.RegisterInterface((*Evidence)(nil), nil)
|
||||||
cdc.RegisterConcrete(&DuplicateVoteEvidence{}, "tendermint/Evidence", nil)
|
cdc.RegisterConcrete(&DuplicateVoteEvidence{}, "tendermint/DuplicateVoteEvidence", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user