Skip to content
This repository has been archived by the owner on Jan 31, 2025. It is now read-only.

Commit

Permalink
fix: Make lanes mutually exclusive by default (#206)
Browse files Browse the repository at this point in the history
* lanes always mutually exclusive

* nit 1.0.0.0

* gg adding back interface

---------

Co-authored-by: Alex Johnson <[email protected]>
  • Loading branch information
davidterpay and Alex Johnson authored Nov 20, 2023
1 parent f1beb21 commit f607439
Show file tree
Hide file tree
Showing 17 changed files with 475 additions and 247 deletions.
67 changes: 40 additions & 27 deletions abci/abci_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ func (s *ProposalsTestSuite) TestPrepareProposal() {

func (s *ProposalsTestSuite) TestPrepareProposalEdgeCases() {
s.Run("can build a proposal if a lane panics first", func() {
panicLane := s.setUpPanicLane(math.LegacyMustNewDecFromStr("0.25"))
panicLane := s.setUpPanicLane("panik1", math.LegacyMustNewDecFromStr("0.25"))

tx, err := testutils.CreateRandomTx(
s.encodingConfig.TxConfig,
Expand Down Expand Up @@ -708,19 +708,21 @@ func (s *ProposalsTestSuite) TestPrepareProposalEdgeCases() {
},
}

mempool := block.NewLanedMempool(
log.NewTestLogger(s.T()),
false,
mempool, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
mocks.NewMockLaneFetcher(func() (blocksdkmoduletypes.Lane, error) {
return blocksdkmoduletypes.Lane{}, nil
}, func() []blocksdkmoduletypes.Lane {
return chainLanes
}),
lanes...,
)
s.Require().NoError(err)

defaultLane.SetIgnoreList(nil)

proposalHandler := abci.NewProposalHandler(
log.NewTestLogger(s.T()),
log.NewNopLogger(),
s.encodingConfig.TxConfig.TxDecoder(),
s.encodingConfig.TxConfig.TxEncoder(),
mempool,
Expand Down Expand Up @@ -748,7 +750,7 @@ func (s *ProposalsTestSuite) TestPrepareProposalEdgeCases() {
})

s.Run("can build a proposal if second lane panics", func() {
panicLane := s.setUpPanicLane(math.LegacyMustNewDecFromStr("0.25"))
panicLane := s.setUpPanicLane("panik1", math.LegacyMustNewDecFromStr("0.25"))

tx, err := testutils.CreateRandomTx(
s.encodingConfig.TxConfig,
Expand Down Expand Up @@ -784,19 +786,21 @@ func (s *ProposalsTestSuite) TestPrepareProposalEdgeCases() {
},
}

mempool := block.NewLanedMempool(
log.NewTestLogger(s.T()),
false,
mempool, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
mocks.NewMockLaneFetcher(func() (blocksdkmoduletypes.Lane, error) {
return blocksdkmoduletypes.Lane{}, nil
}, func() []blocksdkmoduletypes.Lane {
return chainLanes
}),
lanes...,
)
s.Require().NoError(err)

defaultLane.SetIgnoreList(nil)

proposalHandler := abci.NewProposalHandler(
log.NewTestLogger(s.T()),
log.NewNopLogger(),
s.encodingConfig.TxConfig.TxDecoder(),
s.encodingConfig.TxConfig.TxEncoder(),
mempool,
Expand Down Expand Up @@ -824,8 +828,8 @@ func (s *ProposalsTestSuite) TestPrepareProposalEdgeCases() {
})

s.Run("can build a proposal if multiple consecutive lanes panic", func() {
panicLane := s.setUpPanicLane(math.LegacyMustNewDecFromStr("0.25"))
panicLane2 := s.setUpPanicLane(math.LegacyMustNewDecFromStr("0.25"))
panicLane := s.setUpPanicLane("panik1", math.LegacyMustNewDecFromStr("0.25"))
panicLane2 := s.setUpPanicLane("panik2", math.LegacyMustNewDecFromStr("0.25"))

tx, err := testutils.CreateRandomTx(
s.encodingConfig.TxConfig,
Expand Down Expand Up @@ -867,18 +871,23 @@ func (s *ProposalsTestSuite) TestPrepareProposalEdgeCases() {
},
}

mempool := block.NewLanedMempool(
log.NewTestLogger(s.T()),
false,
mempool, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
mocks.NewMockLaneFetcher(func() (blocksdkmoduletypes.Lane, error) {
return blocksdkmoduletypes.Lane{}, nil
}, func() []blocksdkmoduletypes.Lane {
return chainLanes
}),
lanes...,
)
s.Require().NoError(err)

panicLane.SetIgnoreList(nil)
panicLane2.SetIgnoreList(nil)
defaultLane.SetIgnoreList(nil)

proposalHandler := abci.NewProposalHandler(
log.NewTestLogger(s.T()),
log.NewNopLogger(),
s.encodingConfig.TxConfig.TxDecoder(),
s.encodingConfig.TxConfig.TxEncoder(),
mempool,
Expand Down Expand Up @@ -906,8 +915,8 @@ func (s *ProposalsTestSuite) TestPrepareProposalEdgeCases() {
})

s.Run("can build a proposal if the last few lanes panic", func() {
panicLane := s.setUpPanicLane(math.LegacyMustNewDecFromStr("0.25"))
panicLane2 := s.setUpPanicLane(math.LegacyMustNewDecFromStr("0.25"))
panicLane := s.setUpPanicLane("panik1", math.LegacyMustNewDecFromStr("0.25"))
panicLane2 := s.setUpPanicLane("panik2", math.LegacyMustNewDecFromStr("0.25"))

tx, err := testutils.CreateRandomTx(
s.encodingConfig.TxConfig,
Expand Down Expand Up @@ -949,19 +958,23 @@ func (s *ProposalsTestSuite) TestPrepareProposalEdgeCases() {
},
}

mempool := block.NewLanedMempool(
log.NewTestLogger(s.T()),
false,
mempool, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
mocks.NewMockLaneFetcher(func() (blocksdkmoduletypes.Lane, error) {
return blocksdkmoduletypes.Lane{}, nil
}, func() []blocksdkmoduletypes.Lane {
return chainLanes
}),
lanes...,
)
s.Require().NoError(err)

panicLane.SetIgnoreList(nil)
panicLane2.SetIgnoreList(nil)
defaultLane.SetIgnoreList(nil)

proposalHandler := abci.NewProposalHandler(
log.NewTestLogger(s.T()),
log.NewNopLogger(),
s.encodingConfig.TxConfig.TxDecoder(),
s.encodingConfig.TxConfig.TxEncoder(),
mempool,
Expand Down Expand Up @@ -1237,7 +1250,7 @@ func (s *ProposalsTestSuite) TestProcessProposal() {

s.Run("rejects a proposal when a lane panics", func() {
mevLane := s.setUpTOBLane(math.LegacyMustNewDecFromStr("0.25"), map[sdk.Tx]bool{})
panicLane := s.setUpPanicLane(math.LegacyMustNewDecFromStr("0.0"))
panicLane := s.setUpPanicLane("default", math.LegacyMustNewDecFromStr("0.0"))

txbz, err := testutils.CreateRandomTxBz(
s.encodingConfig.TxConfig,
Expand Down
22 changes: 11 additions & 11 deletions abci/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func (s *ProposalsTestSuite) setUpAnteHandler(expectedExecution map[sdk.Tx]bool)

func (s *ProposalsTestSuite) setUpStandardLane(maxBlockSpace math.LegacyDec, expectedExecution map[sdk.Tx]bool) *defaultlane.DefaultLane {
cfg := base.LaneConfig{
Logger: log.NewTestLogger(s.T()),
Logger: log.NewNopLogger(),
TxEncoder: s.encodingConfig.TxConfig.TxEncoder(),
TxDecoder: s.encodingConfig.TxConfig.TxDecoder(),
AnteHandler: s.setUpAnteHandler(expectedExecution),
Expand All @@ -74,7 +74,7 @@ func (s *ProposalsTestSuite) setUpStandardLane(maxBlockSpace math.LegacyDec, exp

func (s *ProposalsTestSuite) setUpTOBLane(maxBlockSpace math.LegacyDec, expectedExecution map[sdk.Tx]bool) *mev.MEVLane {
cfg := base.LaneConfig{
Logger: log.NewTestLogger(s.T()),
Logger: log.NewNopLogger(),
TxEncoder: s.encodingConfig.TxConfig.TxEncoder(),
TxDecoder: s.encodingConfig.TxConfig.TxDecoder(),
AnteHandler: s.setUpAnteHandler(expectedExecution),
Expand All @@ -87,7 +87,7 @@ func (s *ProposalsTestSuite) setUpTOBLane(maxBlockSpace math.LegacyDec, expected

func (s *ProposalsTestSuite) setUpFreeLane(maxBlockSpace math.LegacyDec, expectedExecution map[sdk.Tx]bool) *free.FreeLane {
cfg := base.LaneConfig{
Logger: log.NewTestLogger(s.T()),
Logger: log.NewNopLogger(),
TxEncoder: s.encodingConfig.TxConfig.TxEncoder(),
TxDecoder: s.encodingConfig.TxConfig.TxDecoder(),
AnteHandler: s.setUpAnteHandler(expectedExecution),
Expand All @@ -98,9 +98,9 @@ func (s *ProposalsTestSuite) setUpFreeLane(maxBlockSpace math.LegacyDec, expecte
return free.NewFreeLane(cfg, base.DefaultTxPriority(), free.DefaultMatchHandler())
}

func (s *ProposalsTestSuite) setUpPanicLane(maxBlockSpace math.LegacyDec) *base.BaseLane {
func (s *ProposalsTestSuite) setUpPanicLane(name string, maxBlockSpace math.LegacyDec) *base.BaseLane {
cfg := base.LaneConfig{
Logger: log.NewTestLogger(s.T()),
Logger: log.NewNopLogger(),
TxEncoder: s.encodingConfig.TxConfig.TxEncoder(),
TxDecoder: s.encodingConfig.TxConfig.TxDecoder(),
MaxBlockSpace: maxBlockSpace,
Expand All @@ -109,7 +109,7 @@ func (s *ProposalsTestSuite) setUpPanicLane(maxBlockSpace math.LegacyDec) *base.

lane := base.NewBaseLane(
cfg,
"panic",
name,
base.NewMempool[string](base.DefaultTxPriority(), cfg.TxEncoder, cfg.SignerExtractor, 0),
base.DefaultMatchHandler(),
)
Expand Down Expand Up @@ -138,15 +138,15 @@ func (s *ProposalsTestSuite) setUpProposalHandlers(lanes []block.Lane) *abci.Pro
return blocksdkLanes
})

mempool := block.NewLanedMempool(log.NewTestLogger(
s.T()),
false,
mempool, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
laneFetcher,
lanes...,
)
s.Require().NoError(err)

return abci.NewProposalHandler(
log.NewTestLogger(s.T()),
log.NewNopLogger(),
s.encodingConfig.TxConfig.TxDecoder(),
s.encodingConfig.TxConfig.TxEncoder(),
mempool,
Expand Down
10 changes: 10 additions & 0 deletions block/base/lane.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ func (l *BaseLane) Match(ctx sdk.Context, tx sdk.Tx) bool {
// list is utilized to prevent transactions that should be considered in other lanes
// from being considered from this lane.
func (l *BaseLane) CheckIgnoreList(ctx sdk.Context, tx sdk.Tx) bool {
if l.cfg.IgnoreList == nil {
return false
}

for _, lane := range l.cfg.IgnoreList {
if lane.Match(ctx, tx) {
return true
Expand All @@ -148,6 +152,12 @@ func (l *BaseLane) SetIgnoreList(lanes []block.Lane) {
l.cfg.IgnoreList = lanes
}

// GetIgnoreList returns the ignore list for the lane. The ignore list is a list
// of lanes that the lane should ignore when processing transactions.
func (l *BaseLane) GetIgnoreList() []block.Lane {
return l.cfg.IgnoreList
}

// SetAnteHandler sets the ante handler for the lane.
func (l *BaseLane) SetAnteHandler(anteHandler sdk.AnteHandler) {
l.cfg.AnteHandler = anteHandler
Expand Down
3 changes: 3 additions & 0 deletions block/lane.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ type Lane interface {
// SetIgnoreList sets the lanes that should be ignored by this lane.
SetIgnoreList(ignoreList []Lane)

// GetIgnoreList returns the lanes that should be ignored by this lane.
GetIgnoreList() []Lane

// Match determines if a transaction belongs to this lane.
Match(ctx sdk.Context, tx sdk.Tx) bool
}
Expand Down
Loading

0 comments on commit f607439

Please sign in to comment.