Go to file
David Terpay 5231cafbd4
fix(timeouts): [ENG-749] Making timeouts configurable (#79)
Co-authored-by: Aleksandr Bezobchuk <alexanderbez@users.noreply.github.com>
2023-04-24 12:13:09 -04:00
.github ci: Create lint-pr.yml (#78) 2023-04-24 10:02:02 -04:00
abci [ENG-733]: Supporting generic auction transaction configurations (#66) 2023-04-19 13:41:15 -04:00
api/pob/builder [ENG-731]: Support for Dependencies Injection (#65) 2023-04-18 16:45:31 -04:00
codec feat: base mempool setup (#2) 2023-03-01 11:47:44 -05:00
mempool fix(timeouts): [ENG-749] Making timeouts configurable (#79) 2023-04-24 12:13:09 -04:00
proto [ENG-731]: Support for Dependencies Injection (#65) 2023-04-18 16:45:31 -04:00
scripts [ENG-731]: Support for Dependencies Injection (#65) 2023-04-18 16:45:31 -04:00
testutils [ENG-680]: Enforcing auction txs to have timeouts (#52) 2023-04-10 12:19:25 -04:00
x/builder fix(timeouts): [ENG-749] Making timeouts configurable (#79) 2023-04-24 12:13:09 -04:00
.gitignore initial commit 2023-02-23 12:44:15 -05:00
.golangci.yml CI Setup (#19) 2023-03-14 10:23:27 -04:00
.goreleaser.yml chore: remove license 2023-04-14 09:19:36 -05:00
.markdownlint.json [ENG-711]: First write through of the spec (#57) 2023-04-18 19:46:43 +00:00
.markdownlintignore [ENG-711]: First write through of the spec (#57) 2023-04-18 19:46:43 +00:00
.mergify.yml Create .mergify.yml (#59) 2023-04-13 13:20:43 -04:00
go.mod chore(deps): bump cosmossdk.io/core from 0.3.2 to 0.6.1 (#74) 2023-04-19 17:52:21 +00:00
go.sum chore(deps): bump cosmossdk.io/core from 0.3.2 to 0.6.1 (#74) 2023-04-19 17:52:21 +00:00
Makefile [ENG-731]: Support for Dependencies Injection (#65) 2023-04-18 16:45:31 -04:00
README.md Rename spec.md to SPEC.md (#67) 2023-04-18 19:57:43 +00:00
SPEC.md Rename spec.md to SPEC.md (#67) 2023-04-18 19:57:43 +00:00

Protocol-Owned Builder

Project Status: Active – The project has reached a stable, usable state and is being actively developed. GoDoc Go Report Card Version License: Apache-2.0 Lines Of Code

Skip Protocol's Protocol-Owned Builder (POB) is a set of Cosmos SDK and ABCI++ primitives that provide application developers the ability to define how their apps construct and validate blocks on-chain in a transparent, enforceable way, such as giving complete control to the protocol to recapture, control, and redistribute MEV.

Skip's POB provides developers with a set of a few core primitives:

  • x/builder: This Cosmos SDK module gives applications the ability to process MEV bundled transactions in addition to having the ability to define how searchers and block proposers are rewarded. In addition, the module defines a AuctionDecorator, which is an AnteHandler decorator that enforces various chain configurable MEV rules.
  • ProposalHandler: This ABCI++ handler defines PrepareProposal and ProcessProposal methods that give applications the ability to perform top-of-block auctions, which enables recapturing, redistributing and control over MEV. These methods are responsible for block proposal construction and validation.
  • AuctionMempool: An MEV-aware mempool that enables searchers to submit bundled transactions to the mempool and have them bundled into blocks via a top-of-block auction. Searchers include a bid in their bundled transactions and the highest bid wins the auction. Application devs have control over levers that control aspects such as the bid floor and minimum bid increment.

Releases

Release Compatibility Matrix

POB Version Cosmos SDK
v1.x.x v0.47.x

Install

$ go install github.com/skip-mev/pob

Setup

  1. Import the necessary dependencies into your application. This includes the proposal handlers, mempool, keeper, builder types, and builder module. This tutorial will go into more detail into each of the dependencies.

    import (
      proposalhandler "github.com/skip-mev/pob/abci"
      "github.com/skip-mev/pob/mempool"
      "github.com/skip-mev/pob/x/builder"
      builderkeeper "github.com/skip-mev/pob/x/builder/keeper"
      buildertypes "github.com/skip-mev/pob/x/builder/types"
      ...
    )
    
  2. Add your module to the the AppModuleBasic manager. This manager is in charge of setting up basic, non-dependent module elements such as codec registration and genesis verification. This will register the special MsgAuctionBid message. When users want to bid for top of block execution, they will submit a transaction - which we call an auction transaction - that includes a single MsgAuctionBid. We prevent any other messages from being included in auction transaction to prevent malicious behavior - such as front running or sandwiching.

    var (
      ModuleBasics = module.NewBasicManager(
        ...
        builder.AppModuleBasic{},
      )
      ...
    )
    
  3. The builder Keeper is POB's gateway to processing special MsgAuctionBid messages that allow users to participate in the top of block auction, distribute revenue to the auction house, and ensure the validity of auction transactions.

    a. First add the keeper to the app's struct definition.

    type App struct {
      BuilderKeeper builderkeeper.Keeper
      ...
    }
    

    b. Add the builder module to the list of module account permissions. This will instantiate the builder module account on genesis.

    maccPerms = map[string][]string{
      builder.ModuleName: nil,
      ...
    }
    

    c. Instantiate the builder keeper, store keys, and module manager. Note, be sure to do this after all the required keeper dependencies have been instantiated.

    keys := storetypes.NewKVStoreKeys(
      buildertypes.StoreKey,
      ...
    )
    
    ...
    app.BuilderKeeper := builderkeeper.NewKeeper(
      appCodec,
      keys[buildertypes.StoreKey],
      app.AccountKeeper,
      app.BankKeeper,
      app.DistrKeeper,
      app.StakingKeeper,
      authtypes.NewModuleAddress(govv1.ModuleName).String(),
    )
    
    
    app.ModuleManager = module.NewManager(
      builder.NewAppModule(appCodec, app.BuilderKeeper),
      ...
    )
    

    d. Searchers bid to have their bundles executed at the top of the block using MsgAuctionBid messages. While the builder Keeper is capable of tracking valid bids, it is unable to correctly sequence the auction transactions alongside the normal transactions without having access to the applications mempool. As such, we have to instantiate POBs custom AuctionMempool - a modified version of the SDKs priority sender-nonce mempool - into the application. Note, this should be done after BaseApp is instantiated.

    mempool := mempool.NewAuctionMempool(txConfig.TxDecoder(), GetMaxMempoolSize())
    bApp.SetMempool(mempool)
    

    e. With Cosmos SDK version 0.47.0, the process of building blocks has been updated and moved from the consensus layer, CometBFT, to the application layer. When a new block is requested, the proposer for that height will utilize the PrepareProposal handler to build a block while the ProcessProposal handler will verify the contents of the block proposal by all validators. The combination of the AuctionMempool, PrepareProposal and ProcessProposal handlers allows the application to verifiably build valid blocks with top-of-block block space reserved for auctions.

    handler := proposalhandler.NewProposalHandler(
      mempool, 
      bApp.Logger(), 
      bApp,
      txConfig.TxEncoder(),
      txConfig.TxDecoder(),
    )
    bApp.SetPrepareProposal(handler.PrepareProposalHandler())
    bApp.SetProcessProposal(handler.ProcessProposalHandler())
    

    f. Finally, update the app's InitGenesis order and ante-handler chain.

    genesisModuleOrder := []string{
      buildertypes.ModuleName,
      ...,
    }
    
    anteDecorators := []sdk.AnteDecorator{
      auction.NewAuctionDecorator(
        app.BuilderKeeper,
        txConfig.TxDecoder(),
        txConfig.TxEncoder(),
        mempool,
      ),
      ...,
    }
    

Note, before building or upgrading the application, make sure to initialize the escrow address for POB in the parameters of the module. The default parameters do not initialize an escrow address as that should be determined by governance. The escrow address will be the address that is receiving a portion of auction house revenue alongside the proposer (if enabled).