Skip to content

Commit

Permalink
fix(p2p): handle default mempool check tx error case (#698)
Browse files Browse the repository at this point in the history
  • Loading branch information
zale144 authored Apr 18, 2024
1 parent 5f325e5 commit fb0d547
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 9 deletions.
19 changes: 10 additions & 9 deletions p2p/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import (
"context"
"errors"

"github.com/dymensionxyz/dymint/mempool"
nodemempool "github.com/dymensionxyz/dymint/node/mempool"
"github.com/dymensionxyz/dymint/types"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/libs/pubsub"
corep2p "github.com/tendermint/tendermint/p2p"

"github.com/dymensionxyz/dymint/mempool"
nodemempool "github.com/dymensionxyz/dymint/node/mempool"
"github.com/dymensionxyz/dymint/types"
)

// GossipValidator is a callback function type.
Expand Down Expand Up @@ -43,9 +44,9 @@ func NewValidator(logger types.Logger, pusbsubServer *pubsub.Server) *Validator
func (v *Validator) TxValidator(mp mempool.Mempool, mpoolIDS *nodemempool.MempoolIDs) GossipValidator {
return func(txMessage *GossipMessage) bool {
v.logger.Debug("transaction received", "bytes", len(txMessage.Data))
checkTxResCh := make(chan *abci.Response, 1)
var res *abci.Response
err := mp.CheckTx(txMessage.Data, func(resp *abci.Response) {
checkTxResCh <- resp
res = resp
}, mempool.TxInfo{
SenderID: mpoolIDS.GetForPeer(txMessage.From),
SenderP2PID: corep2p.ID(txMessage.From),
Expand All @@ -59,12 +60,12 @@ func (v *Validator) TxValidator(mp mempool.Mempool, mpoolIDS *nodemempool.Mempoo
return false
case errors.Is(err, mempool.ErrPreCheck{}):
return false
default:
case err != nil:
v.logger.Error("check tx", "error", err)
return false
}
res := <-checkTxResCh
checkTxResp := res.GetCheckTx()

return checkTxResp.Code == abci.CodeTypeOK
return res.GetCheckTx().Code == abci.CodeTypeOK
}
}

Expand Down
103 changes: 103 additions & 0 deletions p2p/validator_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package p2p_test

import (
"testing"

"github.com/libp2p/go-libp2p/core/peer"
"github.com/stretchr/testify/assert"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/libs/log"

"github.com/tendermint/tendermint/types"

"github.com/dymensionxyz/dymint/mempool"
nodemempool "github.com/dymensionxyz/dymint/node/mempool"
"github.com/dymensionxyz/dymint/p2p"
)

func TestValidator_TxValidator(t *testing.T) {
type args struct {
mp mempool.Mempool
numMsgs int
}
tests := []struct {
name string
args args
want bool
}{
{
name: "valid: tx already in cache",
args: args{
mp: &mockMP{err: mempool.ErrTxInCache},
numMsgs: 3,
},
want: true,
}, {
name: "valid: mempool is full",
args: args{
mp: &mockMP{err: mempool.ErrMempoolIsFull{}},
numMsgs: 3,
},
want: true,
}, {
name: "invalid: tx too large",
args: args{
mp: &mockMP{err: mempool.ErrTxTooLarge{}},
numMsgs: 3,
},
want: false,
}, {
name: "invalid: pre-check error",
args: args{
mp: &mockMP{err: mempool.ErrPreCheck{}},
numMsgs: 3,
},
want: false,
}, {
name: "valid: no error",
args: args{
mp: &mockMP{},
numMsgs: 3,
},
want: true,
}, {
name: "unknown error",
args: args{
mp: &mockMP{err: assert.AnError},
numMsgs: 3,
},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
logger := log.TestingLogger()
validateTx := p2p.NewValidator(logger, nil).TxValidator(tt.args.mp, nodemempool.NewMempoolIDs())
valid := validateTx(txMsg)
assert.Equalf(t, tt.want, valid, "validateTx() = %v, want %v", valid, tt.want)
})
}
}

type mockMP struct {
mempool.Mempool
err error
}

func (m *mockMP) CheckTx(_ types.Tx, cb func(*abci.Response), _ mempool.TxInfo) error {
if cb != nil {
code := abci.CodeTypeOK
if m.err != nil {
code = 1
}
cb(&abci.Response{
Value: &abci.Response_CheckTx{CheckTx: &abci.ResponseCheckTx{Code: code}},
})
}
return m.err
}

var txMsg = &p2p.GossipMessage{
Data: []byte("data"),
From: peer.ID("from"),
}

0 comments on commit fb0d547

Please sign in to comment.