Skip to content

Commit

Permalink
Merge branch 'BEDS-1179/pectra-api'
Browse files Browse the repository at this point in the history
  • Loading branch information
remoterami committed Feb 6, 2025
1 parent de92991 commit c1cfe37
Show file tree
Hide file tree
Showing 43 changed files with 1,557 additions and 306 deletions.
5 changes: 2 additions & 3 deletions backend/cmd/exporter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"github.com/gobitfly/beaconchain/pkg/commons/version"
"github.com/gobitfly/beaconchain/pkg/exporter/modules"
"github.com/gobitfly/beaconchain/pkg/exporter/services"
"github.com/gobitfly/beaconchain/pkg/monitoring"
)

func Run() {
Expand Down Expand Up @@ -138,8 +137,8 @@ func Run() {
wg.Wait()

// enable light-weight db connection monitoring
monitoring.Init(false)
monitoring.Start()
// monitoring.Init(false)
// monitoring.Start()

if utils.Config.TieredCacheProvider != "redis" {
log.Fatal(fmt.Errorf("no cache provider set, please set TierdCacheProvider (example redis)"), "", 0)
Expand Down
23 changes: 13 additions & 10 deletions backend/cmd/misc/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,12 +138,13 @@ func Run() {
requires, ok := REQUIRES_LIST[opts.Command]
if !ok {
requires = misctypes.Requires{
Bigtable: true,
Redis: true,
ClNode: true,
ElNode: true,
UserDBs: true,
NetworkDBs: true,
Bigtable: true,
Redis: true,
ClNode: true,
ElNode: true,
UserDBs: true,
NetworkDBs: true,
ClickhouseDBs: false,
}
}

Expand Down Expand Up @@ -195,9 +196,11 @@ func Run() {
}

// clickhouse
db.ClickHouseWriter, db.ClickHouseReader = db.MustInitDB(&cfg.ClickHouse.WriterDatabase, &cfg.ClickHouse.ReaderDatabase, "clickhouse", "clickhouse")
defer db.ClickHouseReader.Close()
defer db.ClickHouseWriter.Close()
if requires.ClickhouseDBs {
db.ClickHouseWriter, db.ClickHouseReader = db.MustInitDB(&cfg.ClickHouse.WriterDatabase, &cfg.ClickHouse.ReaderDatabase, "clickhouse", "clickhouse")
defer db.ClickHouseReader.Close()
defer db.ClickHouseWriter.Close()
}

// Initialize the persistent redis client
if requires.Redis {
Expand Down Expand Up @@ -1142,7 +1145,7 @@ func debugBlocks(clClient *rpc.LighthouseClient) error {
} else if clBlock.ExecutionPayload.BlockNumber != i {
log.Warnf("clBlock.ExecutionPayload.BlockNumber != i: %v != %v", clBlock.ExecutionPayload.BlockNumber, i)
} else {
logFields["cl.txs"] = len(clBlock.ExecutionPayload.Transactions)
logFields["cl.txs"] = clBlock.ExecutionPayload.TransactionsCount
}

log.InfoWithFields(logFields, "debug block")
Expand Down
13 changes: 7 additions & 6 deletions backend/cmd/misc/misctypes/requires.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package misctypes

type Requires struct {
Bigtable bool
Redis bool
ClNode bool
ElNode bool
NetworkDBs bool
UserDBs bool
Bigtable bool
Redis bool
ClNode bool
ElNode bool
NetworkDBs bool
UserDBs bool
ClickhouseDBs bool
}
8 changes: 6 additions & 2 deletions backend/pkg/api/data_access/dummy.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,10 @@ func (d *DummyService) GetValidatorsFromSlices(ctx context.Context, indices []ui
return getDummyData[[]t.VDBValidator](ctx)
}

func (d *DummyService) GetValidatorsEffectiveBalanceTotal(ctx context.Context, indices []uint64) (uint64, error) {
return getDummyData[uint64](ctx)
}

func (d *DummyService) GetUserDashboards(ctx context.Context, userId uint64) (*t.UserDashboardsData, error) {
return getDummyStruct[t.UserDashboardsData](ctx)
}
Expand Down Expand Up @@ -266,7 +270,7 @@ func (d *DummyService) GetValidatorDashboardGroupExists(ctx context.Context, das
return true, nil
}

func (d *DummyService) AddValidatorDashboardValidators(ctx context.Context, dashboardId t.VDBIdPrimary, groupId uint64, validators []t.VDBValidator) ([]t.VDBPostValidatorsData, error) {
func (d *DummyService) AddValidatorDashboardValidators(ctx context.Context, dashboardId t.VDBIdPrimary, groupId uint64, validators []t.VDBValidator, limit uint64) ([]t.VDBPostValidatorsData, error) {
return getDummyData[[]t.VDBPostValidatorsData](ctx)
}

Expand Down Expand Up @@ -542,7 +546,7 @@ func (d *DummyService) GetValidatorDashboardGroupCount(ctx context.Context, dash
return getDummyData[uint64](ctx)
}

func (d *DummyService) GetValidatorDashboardValidatorsCount(ctx context.Context, dashboardId t.VDBIdPrimary) (uint64, error) {
func (d *DummyService) GetValidatorDashboardEffectiveBalanceTotal(ctx context.Context, dashboardId t.VDBId) (uint64, error) {
return getDummyData[uint64](ctx)
}

Expand Down
84 changes: 84 additions & 0 deletions backend/pkg/api/data_access/general.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@ package dataaccess

import (
"context"
"database/sql"
"fmt"

"github.com/doug-martin/goqu/v9"
"github.com/doug-martin/goqu/v9/exp"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/gobitfly/beaconchain/pkg/api/types"
t "github.com/gobitfly/beaconchain/pkg/api/types"
"github.com/gobitfly/beaconchain/pkg/commons/db"
"github.com/gobitfly/beaconchain/pkg/commons/utils"
constypes "github.com/gobitfly/beaconchain/pkg/consapi/types"
)

// retrieve (primary) ens name and optional name (=label) maintained by beaconcha.in, if present
Expand Down Expand Up @@ -131,3 +135,83 @@ func applySortAndPagination(defaultColumns []types.SortColumn, primary types.Sor

return queryOrder, queryWhere, nil
}

// returns the effective balances of the provided validators
// executed from the vdb premium limits pov, i.e. exited validators account for the EB at exit time
func (d *DataAccessService) GetValidatorsEffectiveBalances(ctx context.Context, validators []t.VDBValidator, onlyActive bool) (map[t.VDBValidator]uint64, error) {
validatorMapping, err := d.services.GetCurrentValidatorMapping()
if err != nil {
return nil, err
}

// active
effectiveBalances := make(map[t.VDBValidator]uint64)
var validatorExitEpochs []exp.Expression
for _, validator := range validators {
if len(validatorMapping.ValidatorMetadata) <= int(validator) {
return nil, fmt.Errorf("validator index %d not found in validator mapping", validator)
}
status := constypes.ValidatorDbStatus(validatorMapping.ValidatorMetadata[validator].Status)
if !onlyActive &&
(status == constypes.DbSlashed || status == constypes.DbExited) &&
validatorMapping.ValidatorMetadata[validator].EffectiveBalance == 0 {
// exited & balance withdrawn, need to query latest EB before exit
if !validatorMapping.ValidatorMetadata[validator].ExitEpoch.Valid {
return nil, fmt.Errorf("validator %d has no exit epoch", validator)
}
// goqu can't pass tuples directly
epochTs := utils.EpochToTime(uint64(validatorMapping.ValidatorMetadata[validator].ExitEpoch.Int64)).Unix()
validatorExitEpochs = append(validatorExitEpochs, goqu.L("(fromUnixTimestamp(?), ?)", epochTs, validator))
} else {
effectiveBalances[validator] = validatorMapping.ValidatorMetadata[validator].EffectiveBalance
}
}

// exited
if len(validatorExitEpochs) > 0 {
ds := goqu.Dialect("postgres").
Select(
// goqu.SUM(goqu.I("balance_effective_end")).As("balance_effective_end"),
goqu.I("validator_index"),
goqu.I("balance_effective_end"),
).
From("validator_dashboard_data_epoch").
Where(
goqu.L("(epoch_timestamp, validator_index)").In(validatorExitEpochs),
)
query, args, err := ds.Prepared(true).ToSQL()
if err != nil {
return nil, err
}

ebsBeforeExit := []struct {
ValidatorIndex uint64 `db:"validator_index"`
EffectiveBalance uint64 `db:"balance_effective_end"`
}{}
err = d.clickhouseReader.SelectContext(ctx, &ebsBeforeExit, query, args...)
if err != nil && err != sql.ErrNoRows {
return nil, err
}
for _, eb := range ebsBeforeExit {
effectiveBalances[eb.ValidatorIndex] = eb.EffectiveBalance
}
}
return effectiveBalances, nil
}

func (d *DataAccessService) GetValidatorsEffectiveBalanceTotal(ctx context.Context, validators []t.VDBValidator) (uint64, error) {
validatorEbs, err := d.GetValidatorsEffectiveBalances(ctx, validators, false)
if err != nil {
return 0, err
}

var totalEb uint64
for _, validator := range validators {
if eb, ok := validatorEbs[validator]; !ok {
return 0, fmt.Errorf("effective balance for validator %d not found", validator)
} else {
totalEb += eb
}
}
return totalEb, nil
}
5 changes: 5 additions & 0 deletions backend/pkg/api/data_access/networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,10 @@ func (d *DataAccessService) GetAllNetworks() ([]types.NetworkInfo, error) {
Name: "sepolia",
NotificationsName: "sepolia",
},
{
ChainId: 7088110746,
Name: "pectra-devnet-5",
NotificationsName: "pectra-devnet-5",
},
}, nil
}
4 changes: 2 additions & 2 deletions backend/pkg/api/data_access/vdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ type ValidatorDashboardRepository interface {
GetValidatorDashboardGroupCount(ctx context.Context, dashboardId t.VDBIdPrimary) (uint64, error)
GetValidatorDashboardGroupExists(ctx context.Context, dashboardId t.VDBIdPrimary, groupId uint64) (bool, error)

AddValidatorDashboardValidators(ctx context.Context, dashboardId t.VDBIdPrimary, groupId uint64, validators []t.VDBValidator) ([]t.VDBPostValidatorsData, error)
AddValidatorDashboardValidators(ctx context.Context, dashboardId t.VDBIdPrimary, groupId uint64, validators []t.VDBValidator, limit uint64) ([]t.VDBPostValidatorsData, error)
AddValidatorDashboardValidatorsByDepositAddress(ctx context.Context, dashboardId t.VDBIdPrimary, groupId uint64, address string, limit uint64) ([]t.VDBPostValidatorsData, error)
AddValidatorDashboardValidatorsByWithdrawalCredential(ctx context.Context, dashboardId t.VDBIdPrimary, groupId uint64, credential string, limit uint64) ([]t.VDBPostValidatorsData, error)
AddValidatorDashboardValidatorsByGraffiti(ctx context.Context, dashboardId t.VDBIdPrimary, groupId uint64, graffiti string, limit uint64) ([]t.VDBPostValidatorsData, error)

RemoveValidatorDashboardValidators(ctx context.Context, dashboardId t.VDBIdPrimary, validators []t.VDBValidator) error
GetValidatorDashboardValidators(ctx context.Context, dashboardId t.VDBId, groupId int64, cursor string, colSort t.Sort[enums.VDBManageValidatorsColumn], search string, limit uint64) ([]t.VDBManageValidatorsTableRow, *t.Paging, error)
GetValidatorDashboardValidatorsCount(ctx context.Context, dashboardId t.VDBIdPrimary) (uint64, error)
GetValidatorDashboardEffectiveBalanceTotal(ctx context.Context, dashboardId t.VDBId) (uint64, error)

CreateValidatorDashboardPublicId(ctx context.Context, dashboardId t.VDBIdPrimary, name string, shareGroups bool) (*t.VDBPublicId, error)
GetValidatorDashboardPublicId(ctx context.Context, publicDashboardId t.VDBIdPublic) (*t.VDBPublicId, error)
Expand Down
Loading

0 comments on commit c1cfe37

Please sign in to comment.