This commit is contained in:
David Terpay
2024-06-24 12:56:06 -04:00
committed by GitHub
parent bfdd58411a
commit 97e5731f52
52 changed files with 23 additions and 10247 deletions
+7 -63
View File
@@ -8,29 +8,19 @@ import (
"cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkmempool "github.com/cosmos/cosmos-sdk/types/mempool"
blocksdkmoduletypes "github.com/skip-mev/block-sdk/v2/x/blocksdk/types"
)
var _ Mempool = (*LanedMempool)(nil)
// LaneFetcher defines the interface to get a lane stored in the x/blocksdk module.
type LaneFetcher interface {
GetLane(ctx sdk.Context, id string) (lane blocksdkmoduletypes.Lane, err error)
GetLanes(ctx sdk.Context) []blocksdkmoduletypes.Lane
}
type (
// Mempool defines the Block SDK mempool interface.
Mempool interface {
sdkmempool.Mempool
// Registry returns the mempool's lane registry.
Registry(ctx sdk.Context) ([]Lane, error)
// Registry returns the lanes in the mempool.
Registry() []Lane
// Contains returns true if any of the lanes currently contain the transaction.
Contains(tx sdk.Tx) bool
// GetTxDistribution returns the number of transactions in each lane.
GetTxDistribution() map[string]uint64
}
@@ -44,10 +34,6 @@ type (
// according to their priority. The first lane in the registry has the
// highest priority and the last lane has the lowest priority.
registry []Lane
// moduleLaneFetcher is the mempool's interface to read on-chain lane
// information in the x/blocksdk module.
moduleLaneFetcher LaneFetcher
}
)
@@ -59,12 +45,10 @@ type (
func NewLanedMempool(
logger log.Logger,
lanes []Lane,
laneFetcher LaneFetcher,
) (*LanedMempool, error) {
mempool := &LanedMempool{
logger: logger,
registry: lanes,
moduleLaneFetcher: laneFetcher,
logger: logger,
registry: lanes,
}
if err := mempool.ValidateBasic(); err != nil {
@@ -163,45 +147,9 @@ func (m *LanedMempool) Contains(tx sdk.Tx) (contains bool) {
return false
}
// Registry returns the mempool's lane registry.
func (m *LanedMempool) Registry(ctx sdk.Context) (newRegistry []Lane, err error) {
if m.moduleLaneFetcher == nil {
return m.registry, fmt.Errorf("module lane fetcher not set")
}
// TODO add a last block updated check ?
// potential future optimization
chainLanes := m.moduleLaneFetcher.GetLanes(ctx)
// order lanes and populate the necessary fields (maxBlockSize, etc)
m.registry, err = m.OrderLanes(chainLanes)
return m.registry, err
}
func (m *LanedMempool) OrderLanes(chainLanes []blocksdkmoduletypes.Lane) (orderedLanes []Lane, err error) {
orderedLanes = make([]Lane, len(chainLanes))
for _, chainLane := range chainLanes {
// panic protect
if chainLane.GetOrder() >= uint64(len(orderedLanes)) {
return orderedLanes, fmt.Errorf("lane order %d out of bounds, invalid configuration", chainLane.GetOrder())
}
_, index, found := FindLane(m.registry, chainLane.Id)
if !found {
return orderedLanes, fmt.Errorf("lane %s not found in registry, invalid configuration", chainLane.Id)
}
lane := m.registry[index]
lane.SetMaxBlockSpace(chainLane.MaxBlockSpace)
orderedLanes[chainLane.GetOrder()] = lane
// remove found lane from registry lanes for quicker find()
m.registry[index] = m.registry[len(m.registry)-1] // Copy last element to index i.
m.registry[len(m.registry)-1] = nil // Erase last element (write zero value).
m.registry = m.registry[:len(m.registry)-1] // Truncate slice.
}
return orderedLanes, nil
// Registry returns the lanes in the mempool.
func (m *LanedMempool) Registry() []Lane {
return m.registry
}
// ValidateBasic validates the mempools configuration. ValidateBasic ensures
@@ -244,9 +192,5 @@ func (m *LanedMempool) ValidateBasic() error {
return fmt.Errorf("sum of total block space percentages will be less than 1")
}
if m.moduleLaneFetcher == nil {
return fmt.Errorf("moduleLaneFetcher muset be set on mempool")
}
return nil
}
+2 -278
View File
@@ -5,10 +5,6 @@ import (
"testing"
"time"
blocksdkmoduletypes "github.com/skip-mev/block-sdk/v2/x/blocksdk/types"
"github.com/skip-mev/block-sdk/v2/block/mocks"
"cosmossdk.io/log"
"cosmossdk.io/math"
storetypes "cosmossdk.io/store/types"
@@ -39,14 +35,8 @@ type BlockBusterTestSuite struct {
freeLane *base.BaseLane
gasTokenDenom string
// sdk module lanes
mevSDKLane blocksdkmoduletypes.Lane
baseSDKLane blocksdkmoduletypes.Lane
freeSDKLane blocksdkmoduletypes.Lane
chainLanes []blocksdkmoduletypes.Lane
lanes []block.Lane
mempool *block.LanedMempool
lanes []block.Lane
mempool *block.LanedMempool
// account set up
accounts []testutils.Account
@@ -85,12 +75,6 @@ func (suite *BlockBusterTestSuite) SetupTest() {
factory.MatchHandler(),
)
suite.mevSDKLane = blocksdkmoduletypes.Lane{
Id: suite.mevLane.Name(),
MaxBlockSpace: suite.mevLane.GetMaxBlockSpace(),
Order: 0,
}
// Free lane set up
freeConfig := base.LaneConfig{
Logger: log.NewNopLogger(),
@@ -106,12 +90,6 @@ func (suite *BlockBusterTestSuite) SetupTest() {
free.DefaultMatchHandler(),
)
suite.freeSDKLane = blocksdkmoduletypes.Lane{
Id: suite.freeLane.Name(),
MaxBlockSpace: suite.freeLane.GetMaxBlockSpace(),
Order: 1,
}
// Base lane set up
baseConfig := base.LaneConfig{
Logger: log.NewNopLogger(),
@@ -126,25 +104,13 @@ func (suite *BlockBusterTestSuite) SetupTest() {
base.DefaultMatchHandler(),
)
suite.baseSDKLane = blocksdkmoduletypes.Lane{
Id: suite.baseLane.Name(),
MaxBlockSpace: suite.baseLane.GetMaxBlockSpace(),
Order: 2,
}
// Mempool set up
suite.lanes = []block.Lane{suite.mevLane, suite.freeLane, suite.baseLane}
suite.chainLanes = []blocksdkmoduletypes.Lane{suite.mevSDKLane, suite.freeSDKLane, suite.baseSDKLane}
var err error
suite.mempool, err = block.NewLanedMempool(
log.NewNopLogger(),
suite.lanes,
mocks.NewMockLaneFetcher(func() (blocksdkmoduletypes.Lane, error) {
return suite.baseSDKLane, nil
}, func() []blocksdkmoduletypes.Lane {
return suite.chainLanes
}),
)
suite.Require().NoError(err)
@@ -157,12 +123,6 @@ func (suite *BlockBusterTestSuite) SetupTest() {
}
func (suite *BlockBusterTestSuite) TestNewMempool() {
fetcher := mocks.NewMockLaneFetcher(func() (blocksdkmoduletypes.Lane, error) {
return blocksdkmoduletypes.Lane{}, nil
}, func() []blocksdkmoduletypes.Lane {
return nil
})
defaultConfig := base.LaneConfig{
Logger: log.NewNopLogger(),
TxEncoder: suite.encodingConfig.TxConfig.TxEncoder(),
@@ -206,7 +166,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().NoError(err)
})
@@ -217,7 +176,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().NoError(err)
})
@@ -228,7 +186,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().NoError(err)
})
@@ -239,7 +196,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().NoError(err)
})
@@ -250,7 +206,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().NoError(err)
})
@@ -261,7 +216,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().NoError(err)
})
@@ -272,7 +226,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().NoError(err)
})
@@ -283,7 +236,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().Error(err)
})
@@ -294,7 +246,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().Error(err)
})
@@ -305,7 +256,6 @@ func (suite *BlockBusterTestSuite) TestNewMempool() {
_, err := block.NewLanedMempool(
log.NewNopLogger(),
lanes,
fetcher,
)
suite.Require().Error(err)
})
@@ -574,229 +524,3 @@ func (suite *BlockBusterTestSuite) fillFreeLane(numTxs uint64) {
suite.Require().NoError(suite.mempool.Insert(suite.ctx, tx))
}
}
func (suite *BlockBusterTestSuite) TestLanedMempool_Registry() {
tests := []struct {
name string
chainLanes []blocksdkmoduletypes.Lane
registryLanes []block.Lane
expectedNewRegistry []block.Lane
wantErr bool
}{
{
name: "invalid lanes in chain",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.freeLane,
suite.mevLane,
suite.baseLane,
},
wantErr: true,
},
{
name: "invalid duplicate lanes in chain",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.baseSDKLane, // order = 2
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.freeLane,
suite.mevLane,
suite.baseLane,
},
wantErr: true,
},
{
name: "invalid lanes in registry",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.freeSDKLane, // order = 1
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.freeLane,
suite.baseLane,
},
wantErr: true,
},
{
name: "valid reorder",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.freeSDKLane, // order = 1
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.freeLane,
suite.mevLane,
suite.baseLane,
},
expectedNewRegistry: []block.Lane{
suite.mevLane,
suite.freeLane,
suite.baseLane,
},
wantErr: false,
},
{
name: "valid no reorder",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.freeSDKLane, // order = 1
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.mevLane,
suite.freeLane,
suite.baseLane,
},
expectedNewRegistry: []block.Lane{
suite.mevLane,
suite.freeLane,
suite.baseLane,
},
wantErr: false,
},
}
for _, tc := range tests {
suite.Run(tc.name, func() {
// setup mock mempool
mempool, err := block.NewLanedMempool(
log.NewNopLogger(),
tc.registryLanes,
mocks.NewMockLaneFetcher(func() (blocksdkmoduletypes.Lane, error) {
return blocksdkmoduletypes.Lane{}, nil
}, func() []blocksdkmoduletypes.Lane {
return tc.chainLanes
}),
)
suite.Require().NoError(err)
gotOrderedLanes, err := mempool.Registry(suite.ctx)
if tc.wantErr {
suite.Require().Error(err)
return
}
suite.Require().NoError(err)
suite.Require().Equal(tc.expectedNewRegistry, gotOrderedLanes)
})
}
}
func (suite *BlockBusterTestSuite) TestLanedMempool_OrderLanes() {
tests := []struct {
name string
chainLanes []blocksdkmoduletypes.Lane
registryLanes []block.Lane
expectedOrderedLane []block.Lane
wantErr bool
}{
{
name: "invalid lanes in chain",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.freeLane,
suite.mevLane,
suite.baseLane,
},
wantErr: true,
},
{
name: "invalid duplicate lanes in chain",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.baseSDKLane, // order = 2
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.freeLane,
suite.mevLane,
suite.baseLane,
},
wantErr: true,
},
{
name: "invalid lanes in registry",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.freeSDKLane, // order = 1
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.freeLane,
suite.baseLane,
},
wantErr: true,
},
{
name: "valid reorder",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.freeSDKLane, // order = 1
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.freeLane,
suite.mevLane,
suite.baseLane,
},
expectedOrderedLane: []block.Lane{
suite.mevLane,
suite.freeLane,
suite.baseLane,
},
wantErr: false,
},
{
name: "valid no reorder",
chainLanes: []blocksdkmoduletypes.Lane{
suite.mevSDKLane, // order = 0
suite.freeSDKLane, // order = 1
suite.baseSDKLane, // order = 2
},
registryLanes: []block.Lane{
suite.mevLane,
suite.freeLane,
suite.baseLane,
},
expectedOrderedLane: []block.Lane{
suite.mevLane,
suite.freeLane,
suite.baseLane,
},
wantErr: false,
},
}
for _, tc := range tests {
suite.Run(tc.name, func() {
// setup mock mempool
mempool, err := block.NewLanedMempool(
log.NewNopLogger(),
tc.registryLanes,
mocks.NewMockLaneFetcher(func() (blocksdkmoduletypes.Lane, error) {
return blocksdkmoduletypes.Lane{}, nil
}, func() []blocksdkmoduletypes.Lane {
return []blocksdkmoduletypes.Lane{}
}),
)
suite.Require().NoError(err)
gotOrderedLanes, err := mempool.OrderLanes(tc.chainLanes)
if tc.wantErr {
suite.Require().Error(err)
return
}
suite.Require().NoError(err)
suite.Require().Equal(tc.expectedOrderedLane, gotOrderedLanes)
})
}
}
-35
View File
@@ -1,35 +0,0 @@
package mocks
import (
sdk "github.com/cosmos/cosmos-sdk/types"
blocksdkmoduletypes "github.com/skip-mev/block-sdk/v2/x/blocksdk/types"
)
type MockLaneFetcher struct {
getLaneHandler func() (blocksdkmoduletypes.Lane, error)
getLanesHandler func() []blocksdkmoduletypes.Lane
}
func NewMockLaneFetcher(getLane func() (blocksdkmoduletypes.Lane, error), getLanes func() []blocksdkmoduletypes.Lane) MockLaneFetcher {
return MockLaneFetcher{
getLaneHandler: getLane,
getLanesHandler: getLanes,
}
}
func (m *MockLaneFetcher) SetGetLaneHandler(h func() (blocksdkmoduletypes.Lane, error)) {
m.getLaneHandler = h
}
func (m MockLaneFetcher) GetLane(_ sdk.Context, _ string) (blocksdkmoduletypes.Lane, error) {
return m.getLaneHandler()
}
func (m *MockLaneFetcher) SetGetLanesHandler(h func() []blocksdkmoduletypes.Lane) {
m.getLanesHandler = h
}
func (m MockLaneFetcher) GetLanes(_ sdk.Context) []blocksdkmoduletypes.Lane {
return m.getLanesHandler()
}