diff --git a/README.md b/README.md index 5f5dd06..ffadd3a 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,9 @@ Skip has built out a number of plug-and-play `lanes` on the SDK that your protoc Most Cosmos chains today utilize standard `CometBFT` block construction - which is too limited. -- The standard `CometBFT` block building is susceptible to MEV-related issues, such as front-running and sandwich attacks, since proposers have monopolistic rights on ordering and no verification of good behavior. MEV that is created cannot be redistributed to the protocol. -- The standard `CometBFT` block building uses a one-size-fits-all approach, which can result in inefficient transaction processing for specific applications or use cases and sub-optimal fee markets. -- Transactions tailored for specific applications may need custom prioritization, ordering or validation rules that the mempool is otherwise unaware of because transactions within a block are currently in-differentiable when a blockchain might want them to be. +* The standard `CometBFT` block building is susceptible to MEV-related issues, such as front-running and sandwich attacks, since proposers have monopolistic rights on ordering and no verification of good behavior. MEV that is created cannot be redistributed to the protocol. +* The standard `CometBFT` block building uses a one-size-fits-all approach, which can result in inefficient transaction processing for specific applications or use cases and sub-optimal fee markets. +* Transactions tailored for specific applications may need custom prioritization, ordering or validation rules that the mempool is otherwise unaware of because transactions within a block are currently in-differentiable when a blockchain might want them to be. ### ✅ Solution: The Block SDK @@ -57,12 +57,12 @@ A block with separate `lanes` can be used for: #### Lane App Store -To read more about Skip's pre-built `lanes` and how to use them, check out the [Lane App Store](). +To read more about Skip's pre-built `lanes` and how to use them, check out the [Lane App Store](https://docs.skip.money/chains/lanes/existing-lanes/default). #### How the Block SDK works -To read more about how the Block SDK works, check out the [How it Works](). +To read more about how the Block SDK works, check out the [How it Works](https://docs.skip.money/chains/how-it-works). #### Lane Development -To read more about how to build your own custom `lanes`, check out the [Build Your Own Lane](). +To read more about how to build your own custom `lanes`, check out the [Build Your Own Lane](https://docs.skip.money/chains/lanes/build-your-own-lane). diff --git a/abci/abci_test.go b/abci/abci_test.go index 090a167..dace5ed 100644 --- a/abci/abci_test.go +++ b/abci/abci_test.go @@ -16,9 +16,9 @@ import ( "github.com/skip-mev/pob/abci" "github.com/skip-mev/pob/block" "github.com/skip-mev/pob/block/base" + defaultlane "github.com/skip-mev/pob/lanes/base" "github.com/skip-mev/pob/lanes/free" "github.com/skip-mev/pob/lanes/mev" - "github.com/skip-mev/pob/lanes/standard" testutils "github.com/skip-mev/pob/testutils" "github.com/stretchr/testify/suite" ) @@ -724,7 +724,7 @@ func (s *ProposalsTestSuite) setUpAnteHandler(expectedExecution map[sdk.Tx]bool) return anteHandler } -func (s *ProposalsTestSuite) setUpStandardLane(maxBlockSpace math.LegacyDec, expectedExecution map[sdk.Tx]bool) *standard.StandardLane { +func (s *ProposalsTestSuite) setUpStandardLane(maxBlockSpace math.LegacyDec, expectedExecution map[sdk.Tx]bool) *defaultlane.DefaultLane { cfg := base.LaneConfig{ Logger: log.NewTestLogger(s.T()), TxEncoder: s.encodingConfig.TxConfig.TxEncoder(), @@ -733,7 +733,7 @@ func (s *ProposalsTestSuite) setUpStandardLane(maxBlockSpace math.LegacyDec, exp MaxBlockSpace: maxBlockSpace, } - return standard.NewStandardLane(cfg) + return defaultlane.NewDefaultLane(cfg) } func (s *ProposalsTestSuite) setUpTOBLane(maxBlockSpace math.LegacyDec, expectedExecution map[sdk.Tx]bool) *mev.MEVLane { diff --git a/block/mempool_test.go b/block/mempool_test.go index 048c562..242b27a 100644 --- a/block/mempool_test.go +++ b/block/mempool_test.go @@ -12,9 +12,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/skip-mev/pob/block" "github.com/skip-mev/pob/block/base" + defaultlane "github.com/skip-mev/pob/lanes/base" "github.com/skip-mev/pob/lanes/free" "github.com/skip-mev/pob/lanes/mev" - "github.com/skip-mev/pob/lanes/standard" testutils "github.com/skip-mev/pob/testutils" buildertypes "github.com/skip-mev/pob/x/builder/types" "github.com/stretchr/testify/suite" @@ -29,7 +29,7 @@ type BlockBusterTestSuite struct { // Define all of the lanes utilized in the test suite mevLane *mev.MEVLane - baseLane *standard.StandardLane + baseLane *defaultlane.DefaultLane freeLane *free.FreeLane gasTokenDenom string @@ -92,7 +92,7 @@ func (suite *BlockBusterTestSuite) SetupTest() { AnteHandler: nil, MaxBlockSpace: math.LegacyZeroDec(), } - suite.baseLane = standard.NewStandardLane( + suite.baseLane = defaultlane.NewDefaultLane( baseConfig, ) diff --git a/lanes/standard/README.md b/lanes/base/README.md similarity index 78% rename from lanes/standard/README.md rename to lanes/base/README.md index d194863..9355271 100644 --- a/lanes/standard/README.md +++ b/lanes/base/README.md @@ -1,22 +1,14 @@ -# Standard Lane +# Default Lane -> The Standard Lane is the most general and least restrictive lane. The Standard +> The Default Lane is the most general and least restrictive lane. The Default > Lane accepts all transactions that are not accepted by the other lanes, is > generally the lowest priority lane, and consumes all blockspace that is not > consumed by the other lanes. ## 📖 Overview -Blockspace is valuable, and MEV bots find arbitrage opportunities to capture -value. The Block SDK provides a fair auction for these opportunities via the -x/auction module inside the Block SDK so that protocols are rewarded while -ensuring that users are not front-run or sandwiched in the process. - -The Block SDK uses the app-side mempool, PrepareLane / ProcessLane, and CheckTx -to create an MEV marketplace inside the protocol. It introduces a new message -type, called a MsgAuctionBid, that allows the submitter to execute multiple -transactions at the top of the block atomically -(atomically = directly next to each other). +The default lane should be used to accept all transactions that are not accepted +by the other lanes. ## 🏗️ Setup @@ -46,17 +38,21 @@ your base application, you will need to create a `LanedMempool` composed of the lanes that you want to use. 2. Next, order the lanes by priority. The first lane is the highest priority lane and the last lane is the lowest priority lane. **It is recommended that the last -lane is the standard lane.** +lane is the default lane.** 3. You will also need to create a `PrepareProposalHandler` and a `ProcessProposalHandler` that will be responsible for preparing and processing proposals respectively. Configure the order of the lanes in the `PrepareProposalHandler` and `ProcessProposalHandler` to match the order of the lanes in the `LanedMempool`. +NOTE: This example walks through setting up the MEV, Free, and Default Lanes. To +only utilize the default lane, ignore the MEV and Free Lane setup. + ```golang import ( "github.com/skip-mev/block-sdk/abci" - "github.com/skip-mev/block-sdk/lanes/standard" + "github.com/skip-mev/block-sdk/block/base" + defaultlane "github.com/skip-mev/block-sdk/lanes/base" ) ... @@ -75,7 +71,7 @@ func NewApp() { // visit the README in block-sdk/block/base. // // MEV lane hosts an action at the top of the block. - mevConfig := constructor.LaneConfig{ + mevConfig := base.LaneConfig{ Logger: app.Logger(), TxEncoder: app.txConfig.TxEncoder(), TxDecoder: app.txConfig.TxDecoder(), @@ -88,7 +84,7 @@ func NewApp() { ) // Free lane allows transactions to be included in the next block for free. - freeConfig := constructor.LaneConfig{ + freeConfig := base.LaneConfig{ Logger: app.Logger(), TxEncoder: app.txConfig.TxEncoder(), TxDecoder: app.txConfig.TxDecoder(), @@ -97,19 +93,19 @@ func NewApp() { } freeLane := free.NewFreeLane( freeConfig, - constructor.DefaultTxPriority(), + base.DefaultTxPriority(), free.DefaultMatchHandler(), ) - // Standard lane accepts all other transactions. - defaultConfig := constructor.LaneConfig{ + // Default lane accepts all other transactions. + defaultConfig := base.LaneConfig{ Logger: app.Logger(), TxEncoder: app.txConfig.TxEncoder(), TxDecoder: app.txConfig.TxDecoder(), MaxBlockSpace: math.LegacyZeroDec(), MaxTxs: 0, } - defaultLane := base.NewStandardLane(defaultConfig) + defaultLane := defaultlane.NewDefaultLane(defaultConfig) // 2. Set up the relateive priority of lanes lanes := []block.Lane{ @@ -126,7 +122,7 @@ func NewApp() { anteDecorators := []sdk.AnteDecorator{ ante.NewSetUpContextDecorator(), ... - utils.NewIgnoreDecorator( + utils.NewIgnoreDecorator( // free lane specific set up ante.NewDeductFeeDecorator( options.BaseOptions.AccountKeeper, options.BaseOptions.BankKeeper, diff --git a/lanes/standard/abci_test.go b/lanes/base/abci_test.go similarity index 99% rename from lanes/standard/abci_test.go rename to lanes/base/abci_test.go index e006e62..317df3b 100644 --- a/lanes/standard/abci_test.go +++ b/lanes/base/abci_test.go @@ -1,4 +1,4 @@ -package standard_test +package base_test import ( "crypto/sha256" @@ -11,7 +11,7 @@ import ( "github.com/skip-mev/pob/block" "github.com/skip-mev/pob/block/base" "github.com/skip-mev/pob/block/utils/mocks" - "github.com/skip-mev/pob/lanes/standard" + defaultlane "github.com/skip-mev/pob/lanes/base" testutils "github.com/skip-mev/pob/testutils" ) @@ -502,7 +502,7 @@ func (s *BaseTestSuite) TestCheckOrder() { func (s *BaseTestSuite) initLane( maxBlockSpace math.LegacyDec, expectedExecution map[sdk.Tx]bool, -) *standard.StandardLane { +) *defaultlane.DefaultLane { config := base.NewLaneConfig( log.NewTestLogger(s.T()), s.encodingConfig.TxConfig.TxEncoder(), @@ -511,7 +511,7 @@ func (s *BaseTestSuite) initLane( maxBlockSpace, ) - return standard.NewStandardLane(config) + return defaultlane.NewDefaultLane(config) } func (s *BaseTestSuite) setUpAnteHandler(expectedExecution map[sdk.Tx]bool) sdk.AnteHandler { diff --git a/lanes/standard/base_test.go b/lanes/base/base_test.go similarity index 96% rename from lanes/standard/base_test.go rename to lanes/base/base_test.go index ac5b956..7852dac 100644 --- a/lanes/standard/base_test.go +++ b/lanes/base/base_test.go @@ -1,4 +1,4 @@ -package standard_test +package base_test import ( "math/rand" diff --git a/lanes/standard/lane.go b/lanes/base/lane.go similarity index 75% rename from lanes/standard/lane.go rename to lanes/base/lane.go index d8543fc..05289b4 100644 --- a/lanes/standard/lane.go +++ b/lanes/base/lane.go @@ -1,4 +1,4 @@ -package standard +package base import ( "github.com/skip-mev/pob/block" @@ -10,20 +10,20 @@ const ( LaneName = "default" ) -var _ block.Lane = (*StandardLane)(nil) +var _ block.Lane = (*DefaultLane)(nil) -// StandardLane defines a default lane implementation. The standard lane orders +// DefaultLane defines a default lane implementation. The default lane orders // transactions by the transaction fees. The default lane accepts any transaction // that is should not be ignored (as defined by the IgnoreList in the LaneConfig). // The default lane builds and verifies blocks in a similar fashion to how the // CometBFT/Tendermint consensus engine builds and verifies blocks pre SDK version // 0.47.0. -type StandardLane struct { //nolint +type DefaultLane struct { //nolint *base.BaseLane } // NewStandardLane returns a new default lane. -func NewStandardLane(cfg base.LaneConfig) *StandardLane { +func NewDefaultLane(cfg base.LaneConfig) *DefaultLane { lane := base.NewBaseLane( cfg, LaneName, @@ -35,7 +35,7 @@ func NewStandardLane(cfg base.LaneConfig) *StandardLane { base.DefaultMatchHandler(), ) - return &StandardLane{ + return &DefaultLane{ BaseLane: lane, } } diff --git a/lanes/standard/mempool_test.go b/lanes/base/mempool_test.go similarity index 99% rename from lanes/standard/mempool_test.go rename to lanes/base/mempool_test.go index b3052b5..b8a5047 100644 --- a/lanes/standard/mempool_test.go +++ b/lanes/base/mempool_test.go @@ -1,4 +1,4 @@ -package standard_test +package base_test import ( "cosmossdk.io/math" diff --git a/tests/app/app.go b/tests/app/app.go index 18294a1..ad953e6 100644 --- a/tests/app/app.go +++ b/tests/app/app.go @@ -64,9 +64,9 @@ import ( "github.com/skip-mev/pob/abci" "github.com/skip-mev/pob/block" "github.com/skip-mev/pob/block/base" + defaultlane "github.com/skip-mev/pob/lanes/base" "github.com/skip-mev/pob/lanes/free" "github.com/skip-mev/pob/lanes/mev" - "github.com/skip-mev/pob/lanes/standard" buildermodule "github.com/skip-mev/pob/x/builder" builderkeeper "github.com/skip-mev/pob/x/builder/keeper" ) @@ -297,7 +297,7 @@ func New( MaxBlockSpace: math.LegacyZeroDec(), MaxTxs: 0, } - defaultLane := standard.NewStandardLane(defaultConfig) + defaultLane := defaultlane.NewDefaultLane(defaultConfig) // Set the lanes into the mempool. lanes := []block.Lane{ diff --git a/x/builder/ante/ante_test.go b/x/builder/ante/ante_test.go index c62231f..6c25a43 100644 --- a/x/builder/ante/ante_test.go +++ b/x/builder/ante/ante_test.go @@ -13,8 +13,8 @@ import ( "github.com/golang/mock/gomock" "github.com/skip-mev/pob/block" "github.com/skip-mev/pob/block/base" + defaultlane "github.com/skip-mev/pob/lanes/base" "github.com/skip-mev/pob/lanes/mev" - "github.com/skip-mev/pob/lanes/standard" testutils "github.com/skip-mev/pob/testutils" "github.com/skip-mev/pob/x/builder/ante" "github.com/skip-mev/pob/x/builder/keeper" @@ -42,7 +42,7 @@ type AnteTestSuite struct { // mempool and lane set up mempool block.Mempool mevLane *mev.MEVLane - baseLane *standard.StandardLane + baseLane *defaultlane.DefaultLane lanes []block.Lane // Account set up @@ -105,7 +105,7 @@ func (suite *AnteTestSuite) SetupTest() { MaxBlockSpace: math.LegacyZeroDec(), IgnoreList: []block.Lane{suite.mevLane}, } - suite.baseLane = standard.NewStandardLane(baseConfig) + suite.baseLane = defaultlane.NewDefaultLane(baseConfig) // Mempool set up suite.lanes = []block.Lane{suite.mevLane, suite.baseLane} @@ -280,13 +280,13 @@ func (suite *AnteTestSuite) TestAnteHandler() { distribution := suite.mempool.GetTxDistribution() suite.Require().Equal(0, distribution[mev.LaneName]) - suite.Require().Equal(0, distribution[standard.LaneName]) + suite.Require().Equal(0, distribution[defaultlane.LaneName]) suite.Require().NoError(suite.mempool.Insert(suite.ctx, topAuctionTx)) distribution = suite.mempool.GetTxDistribution() suite.Require().Equal(1, distribution[mev.LaneName]) - suite.Require().Equal(0, distribution[standard.LaneName]) + suite.Require().Equal(0, distribution[defaultlane.LaneName]) } // Create the actual mev tx and insert into the mempool