From 5d1c758730f7e2b86f3453a95b7bd0b2900c0ff2 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Thu, 5 Apr 2018 05:43:23 -0700 Subject: [PATCH] Fix evidence --- evidence/reactor.go | 34 +++++++++++++--------------------- evidence/store.go | 20 ++++++++++++++------ evidence/store_test.go | 13 ------------- evidence/wire.go | 25 +++++++++++++++++++++++++ p2p/pex/pex_reactor_test.go | 2 +- types/evidence.go | 4 ++-- 6 files changed, 55 insertions(+), 43 deletions(-) create mode 100644 evidence/wire.go diff --git a/evidence/reactor.go b/evidence/reactor.go index 6647db96..aeab4d83 100644 --- a/evidence/reactor.go +++ b/evidence/reactor.go @@ -1,14 +1,12 @@ package evidence import ( - "bytes" "fmt" + "github.com/tendermint/go-amino" + "github.com/tendermint/tmlibs/log" "reflect" "time" - wire "github.com/tendermint/go-wire" - "github.com/tendermint/tmlibs/log" - "github.com/tendermint/tendermint/p2p" "github.com/tendermint/tendermint/types" ) @@ -68,7 +66,7 @@ func (evR *EvidenceReactor) AddPeer(peer p2p.Peer) { // the rest will be sent by the broadcastRoutine evidences := evR.evpool.PriorityEvidence() msg := &EvidenceListMessage{evidences} - success := peer.Send(EvidenceChannel, struct{ EvidenceMessage }{msg}) + success := peer.Send(EvidenceChannel, cdc.MustMarshalBinaryBare(msg)) if !success { // TODO: remove peer ? } @@ -82,7 +80,7 @@ func (evR *EvidenceReactor) RemovePeer(peer p2p.Peer, reason interface{}) { // Receive implements Reactor. // It adds any received evidence to the evpool. func (evR *EvidenceReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte) { - _, msg, err := DecodeMessage(msgBytes) + msg, err := DecodeMessage(msgBytes) if err != nil { evR.Logger.Error("Error decoding message", "src", src, "chId", chID, "msg", msg, "err", err, "bytes", msgBytes) evR.Switch.StopPeerForError(src, err) @@ -119,7 +117,7 @@ func (evR *EvidenceReactor) broadcastRoutine() { case evidence := <-evR.evpool.EvidenceChan(): // broadcast some new 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 // in another routine before marking to be proper. @@ -127,7 +125,7 @@ func (evR *EvidenceReactor) broadcastRoutine() { case <-ticker.C: // broadcast all pending evidence msg := &EvidenceListMessage{evR.evpool.PendingEvidence()} - evR.Switch.Broadcast(EvidenceChannel, struct{ EvidenceMessage }{msg}) + evR.Switch.Broadcast(EvidenceChannel, cdc.MustMarshalBinaryBare(msg)) case <-evR.Quit(): return } @@ -137,24 +135,18 @@ func (evR *EvidenceReactor) broadcastRoutine() { //----------------------------------------------------------------------------- // Messages -const ( - msgTypeEvidence = byte(0x01) -) - // EvidenceMessage is a message sent or received by the EvidenceReactor. type EvidenceMessage interface{} -var _ = wire.RegisterInterface( - struct{ EvidenceMessage }{}, - wire.ConcreteType{&EvidenceListMessage{}, msgTypeEvidence}, -) +func RegisterEvidenceMessages(cdc *amino.Codec) { + cdc.RegisterInterface((*EvidenceMessage)(nil), nil) + cdc.RegisterConcrete(&EvidenceListMessage{}, + "tendermint/evidence/EvidenceListMessagE", nil) +} // DecodeMessage decodes a byte-array into a EvidenceMessage. -func DecodeMessage(bz []byte) (msgType byte, msg EvidenceMessage, err error) { - msgType = bz[0] - n := new(int) - r := bytes.NewReader(bz) - msg = wire.ReadBinary(struct{ EvidenceMessage }{}, r, maxEvidenceMessageSize, n, &err).(struct{ EvidenceMessage }).EvidenceMessage +func DecodeMessage(bz []byte) (msg EvidenceMessage, err error) { + err = cdc.UnmarshalBinaryBare(bz, &msg) return } diff --git a/evidence/store.go b/evidence/store.go index 7c8becd0..081715e3 100644 --- a/evidence/store.go +++ b/evidence/store.go @@ -3,7 +3,6 @@ package evidence import ( "fmt" - wire "github.com/tendermint/go-wire" "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tmlibs/db" ) @@ -104,7 +103,10 @@ func (store *EvidenceStore) ListEvidence(prefixKey string) (evidence []types.Evi val := iter.Value() var ei EvidenceInfo - wire.ReadBinaryBytes(val, &ei) + err := cdc.UnmarshalBinaryBare(val, &ei) + if err != nil { + panic(err) + } evidence = append(evidence, ei.Evidence) } return evidence @@ -119,7 +121,10 @@ func (store *EvidenceStore) GetEvidence(height int64, hash []byte) *EvidenceInfo return nil } var ei EvidenceInfo - wire.ReadBinaryBytes(val, &ei) + err := cdc.UnmarshalBinaryBare(val, &ei) + if err != nil { + panic(err) + } return &ei } @@ -137,7 +142,7 @@ func (store *EvidenceStore) AddNewEvidence(evidence types.Evidence, priority int Priority: priority, Evidence: evidence, } - eiBytes := wire.BinaryBytes(ei) + eiBytes := cdc.MustMarshalBinaryBare(ei) // add it to the store key := keyOutqueue(evidence, priority) @@ -171,7 +176,7 @@ func (store *EvidenceStore) MarkEvidenceAsCommitted(evidence types.Evidence) { ei.Committed = true 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) var ei EvidenceInfo b := store.db.Get(key) - wire.ReadBinaryBytes(b, &ei) + err := cdc.UnmarshalBinaryBare(b, &ei) + if err != nil { + panic(err) + } return ei } diff --git a/evidence/store_test.go b/evidence/store_test.go index 180bee58..3fdb3ba6 100644 --- a/evidence/store_test.go +++ b/evidence/store_test.go @@ -4,7 +4,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - wire "github.com/tendermint/go-wire" "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tmlibs/db" ) @@ -108,15 +107,3 @@ func TestStorePriority(t *testing.T) { 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}, -) diff --git a/evidence/wire.go b/evidence/wire.go new file mode 100644 index 00000000..842e0707 --- /dev/null +++ b/evidence/wire.go @@ -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) +} diff --git a/p2p/pex/pex_reactor_test.go b/p2p/pex/pex_reactor_test.go index 00345758..0938fce9 100644 --- a/p2p/pex/pex_reactor_test.go +++ b/p2p/pex/pex_reactor_test.go @@ -238,7 +238,7 @@ func TestPEXReactorUsesSeedsIfNeeded(t *testing.T) { defer peer.Stop() // 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) { diff --git a/types/evidence.go b/types/evidence.go index 658c4022..371b3159 100644 --- a/types/evidence.go +++ b/types/evidence.go @@ -38,9 +38,9 @@ type Evidence interface { String() string } -func RegisterEvidence(cdc *amino.Codec) { +func RegisterEvidences(cdc *amino.Codec) { cdc.RegisterInterface((*Evidence)(nil), nil) - cdc.RegisterConcrete(&DuplicateVoteEvidence{}, "tendermint/Evidence", nil) + cdc.RegisterConcrete(&DuplicateVoteEvidence{}, "tendermint/DuplicateVoteEvidence", nil) } //-------------------------------------------