Skip to content

Commit

Permalink
db testing!
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelneuder committed Feb 4, 2023
1 parent c1d4f69 commit 9b9c476
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 3 deletions.
5 changes: 3 additions & 2 deletions database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,7 @@ func (s *DatabaseService) UpsertBlockBuilderEntryAfterSubmission(lastSubmission
LastSubmissionSlot: lastSubmission.Slot,
NumSubmissionsTotal: 1,
NumSubmissionsSimError: 0,
CollateralValue: "0", // required to satisfy numeric type, will not override collateral
}
if isError {
entry.NumSubmissionsSimError = 1
Expand Down Expand Up @@ -472,7 +473,7 @@ func (s *DatabaseService) SetBlockBuilderStatus(pubkey string, status common.Bui
}

func (s *DatabaseService) SetBlockBuilderCollateral(pubkey, collateralID, collateralValue string) error {
query := `UPDATE ` + vars.TableBlockBuilder + ` SET collateral_id=$1 collateral_value=$2 WHERE builder_pubkey=$3;`
query := `UPDATE ` + vars.TableBlockBuilder + ` SET collateral_id=$1, collateral_value=$2 WHERE builder_pubkey=$3;`
_, err := s.DB.Exec(query, collateralID, collateralValue, pubkey)
return err
}
Expand Down Expand Up @@ -557,7 +558,7 @@ func (s *DatabaseService) UpsertBuilderDemotion(submitBlockRequest *types.Builde
UPDATE SET
signed_beacon_block = :signed_beacon_block,
signed_validator_registration = :signed_validator_registration,
fee_recipient = :fee_recipient,
fee_recipient = :fee_recipient
`
} else {
// If the block_hash + builder_pubkey conflicts, then all the relevant data must be there already, so do nothing.
Expand Down
140 changes: 139 additions & 1 deletion database/database_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,31 @@ package database
import (
"os"
"testing"
"time"

"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/flashbots/go-boost-utils/bls"
"github.com/flashbots/go-boost-utils/types"
"github.com/flashbots/mev-boost-relay/common"
"github.com/flashbots/mev-boost-relay/database/migrations"
"github.com/flashbots/mev-boost-relay/database/vars"
"github.com/jmoiron/sqlx"
"github.com/stretchr/testify/require"
)

const (
slot = uint64(42)
collateral = 1000
collateralStr = "1000"
collateralID = "builder0x69"
randao = "01234567890123456789012345678901"
)

var (
runDBTests = os.Getenv("RUN_DB_TESTS") == "1" //|| true
testDBDSN = common.GetEnv("TEST_DB_DSN", "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable")
// runDBTests = true
feeRecipient = types.Address{0x02}
testDBDSN = common.GetEnv("TEST_DB_DSN", "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable")
)

func createValidatorRegistration(pubKey string) ValidatorRegistrationEntry {
Expand All @@ -26,6 +40,53 @@ func createValidatorRegistration(pubKey string) ValidatorRegistrationEntry {
}
}

func getTestRandomHash(t *testing.T) types.Hash {
var random types.Hash
err := random.FromSlice([]byte("01234567890123456789012345678901"))
require.NoError(t, err)
return random
}

func getTestBuilderSubmitBlockRequest(t *testing.T) types.BuilderSubmitBlockRequest {
// Setup test key pair.
sk, _, err := bls.GenerateNewKeypair()
require.NoError(t, err)
blsPubkey := bls.PublicKeyFromSecretKey(sk)
var pubkey types.PublicKey
err = pubkey.FromSlice(blsPubkey.Compress())
require.NoError(t, err)

var txn hexutil.Bytes
err = txn.UnmarshalText([]byte("0x03"))
require.NoError(t, err)
bidTrace := &types.BidTrace{
Slot: slot,
BuilderPubkey: pubkey,
ProposerFeeRecipient: feeRecipient,
Value: types.IntToU256(uint64(collateral)),
}
signature, err := types.SignMessage(bidTrace, types.DomainBuilder, sk)
require.NoError(t, err)
return types.BuilderSubmitBlockRequest{
Message: bidTrace,
Signature: signature,
ExecutionPayload: &types.ExecutionPayload{
Timestamp: slot * 12, // 12 seconds per slot.
Transactions: []hexutil.Bytes{txn},
Random: getTestRandomHash(t),
},
}
}

func insertTestBuilder(t *testing.T, db IDatabaseService) string {
req := getTestBuilderSubmitBlockRequest(t)
entry, err := db.SaveBuilderBlockSubmission(&req, nil, time.Now())
require.NoError(t, err)
err = db.UpsertBlockBuilderEntryAfterSubmission(entry, false)
require.NoError(t, err)
return req.Message.BuilderPubkey.String()
}

func resetDatabase(t *testing.T) *DatabaseService {
t.Helper()
if !runDBTests {
Expand Down Expand Up @@ -137,3 +198,80 @@ func TestMigrations(t *testing.T) {
require.NoError(t, err)
require.Equal(t, len(migrations.Migrations.Migrations), rowCount)
}

func TestSetBlockBuilderStatus(t *testing.T) {
db := resetDatabase(t)
pubkey := insertTestBuilder(t, db)

// Before status change.
builder, err := db.GetBlockBuilderByPubkey(pubkey)
require.NoError(t, err)
require.False(t, builder.IsHighPrio)
require.False(t, builder.IsDemoted)
require.False(t, builder.IsBlacklisted)

err = db.SetBlockBuilderStatus(pubkey, common.BuilderStatus{
IsHighPrio: true,
IsDemoted: true,
})
require.NoError(t, err)

// After status change.
builder, err = db.GetBlockBuilderByPubkey(pubkey)
require.NoError(t, err)
require.True(t, builder.IsHighPrio)
require.True(t, builder.IsDemoted)
require.False(t, builder.IsBlacklisted)
}

func TestSetBlockBuilderCollateral(t *testing.T) {
db := resetDatabase(t)
pubkey := insertTestBuilder(t, db)

// Before collateral change.
builder, err := db.GetBlockBuilderByPubkey(pubkey)
require.NoError(t, err)
require.Equal(t, "", builder.CollateralID)
require.Equal(t, "0", builder.CollateralValue)

err = db.SetBlockBuilderCollateral(pubkey, collateralID, collateralStr)
require.NoError(t, err)

// After collateral change.
builder, err = db.GetBlockBuilderByPubkey(pubkey)
require.NoError(t, err)
require.Equal(t, collateralID, builder.CollateralID)
require.Equal(t, collateralStr, builder.CollateralValue)
}

func TestGetBlockBuilderPubkeysByCollateralID(t *testing.T) {
db := resetDatabase(t)
// Insert 2 test builders.
pubkey1 := insertTestBuilder(t, db)
pubkey2 := insertTestBuilder(t, db)

// Set them both to the same collateral id.
err := db.SetBlockBuilderCollateral(pubkey1, collateralID, collateralStr)
require.NoError(t, err)
err = db.SetBlockBuilderCollateral(pubkey2, collateralID, collateralStr)
require.NoError(t, err)

pubkeys, err := db.GetBlockBuilderPubkeysByCollateralID(collateralID)
require.NoError(t, err)
require.Contains(t, pubkeys, pubkey1)
require.Contains(t, pubkeys, pubkey2)
}

func TestUpsertBuilderDemotion(t *testing.T) {
db := resetDatabase(t)
insertTestBuilder(t, db)
req := getTestBuilderSubmitBlockRequest(t)

// Non-refundable demotion (just the block request).
err := db.UpsertBuilderDemotion(&req, nil, nil)
require.NoError(t, err)

// Refundable demotion.
err = db.UpsertBuilderDemotion(&req, &types.SignedBeaconBlock{}, &types.SignedValidatorRegistration{})
require.NoError(t, err)
}

0 comments on commit 9b9c476

Please sign in to comment.