Skip to content

Commit

Permalink
retrieving address details (label, ens, ...) from single method
Browse files Browse the repository at this point in the history
  • Loading branch information
remoterami committed Aug 29, 2024
1 parent 2dc7f45 commit 873d06e
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 26 deletions.
47 changes: 47 additions & 0 deletions backend/pkg/api/data_access/general.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package dataaccess

import (
"context"

"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/gobitfly/beaconchain/pkg/api/types"
"github.com/gobitfly/beaconchain/pkg/commons/db"
)

func (d *DataAccessService) GetLabelsAndEnsForAddresses(ctx context.Context, addressMap map[string]*types.Address) error {
addresses := make([][]byte, 0, len(addressMap))
ensMapping := make(map[string]string, len(addressMap))
for address, data := range addressMap {
ensMapping[address] = ""
add, err := hexutil.Decode(address)
if err != nil {
return err
}
addresses = append(addresses, add)
if data == nil {
addressMap[address] = &types.Address{Hash: types.Hash(address)}
}
}
// determine ENS names
if err := db.GetEnsNamesForAddresses(ensMapping); err != nil {
return err
}
for address, ens := range ensMapping {
addressMap[address].Ens = ens
}

// determine tags
tags := []struct {
Address []byte `db:"address"`
Tag string `db:"tag"`
}{}
err := d.alloyReader.SelectContext(ctx, &tags, `SELECT address, tag FROM address_tags WHERE address = ANY($1)`, addresses)
if err != nil {
return err
}

for _, tag := range tags {
addressMap[hexutil.Encode(tag.Address)].Label = tag.Tag
}
return nil
}
11 changes: 6 additions & 5 deletions backend/pkg/api/data_access/vdb_blocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ func (d *DataAccessService) GetValidatorDashboardBlocks(ctx context.Context, das
}

data := make([]t.VDBBlocksTableRow, len(proposals))
ensMapping := make(map[string]string)
addressMapping := make(map[string]*t.Address)
contractStatusRequests := make([]db.ContractInteractionAtRequest, 0, len(proposals))
for i, proposal := range proposals {
data[i].GroupId = proposal.Group
Expand Down Expand Up @@ -386,7 +386,7 @@ func (d *DataAccessService) GetValidatorDashboardBlocks(ctx context.Context, das
Hash: t.Hash(hexutil.Encode(proposal.FeeRecipient)),
}
data[i].RewardRecipient = &rewardRecp
ensMapping[hexutil.Encode(proposal.FeeRecipient)] = ""
addressMapping[hexutil.Encode(proposal.FeeRecipient)] = nil
contractStatusRequests = append(contractStatusRequests, db.ContractInteractionAtRequest{
Address: string(proposal.FeeRecipient),
Block: proposal.Block.Int64,
Expand All @@ -403,10 +403,11 @@ func (d *DataAccessService) GetValidatorDashboardBlocks(ctx context.Context, das
}
// determine reward recipient ENS names
startTime = time.Now()
if err := db.GetEnsNamesForAddresses(ensMapping); err != nil {
// determine ens/tags
if err := d.GetLabelsAndEnsForAddresses(ctx, addressMapping); err != nil {
return nil, nil, err
}
log.Debugf("=== getting ens names took %s", time.Since(startTime))
log.Debugf("=== getting ens + labels names took %s", time.Since(startTime))
// determine contract statuses
contractStatuses, err := d.bigtable.GetAddressContractInteractionsAt(contractStatusRequests)
if err != nil {
Expand All @@ -415,7 +416,7 @@ func (d *DataAccessService) GetValidatorDashboardBlocks(ctx context.Context, das
var contractIdx int
for _, resultRow := range data {
if resultRow.RewardRecipient != nil {
resultRow.RewardRecipient.Ens = ensMapping[string(resultRow.RewardRecipient.Hash)]
resultRow.RewardRecipient = addressMapping[string(resultRow.RewardRecipient.Hash)]
resultRow.RewardRecipient.IsContract = contractStatuses[contractIdx] == types.CONTRACT_CREATION || contractStatuses[contractIdx] == types.CONTRACT_PRESENT
contractIdx += 1
}
Expand Down
12 changes: 5 additions & 7 deletions backend/pkg/api/data_access/vdb_deposits.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,21 +123,20 @@ func (d *DataAccessService) GetValidatorDashboardElDeposits(ctx context.Context,
}

responseData := make([]t.VDBExecutionDepositsTableRow, len(data))
ensMapping := make(map[string]string)
addressMapping := make(map[string]*t.Address)
fromContractStatusRequests := make([]db.ContractInteractionAtRequest, len(data))
depositorContractStatusRequests := make([]db.ContractInteractionAtRequest, 0, len(data))
for i, row := range data {
responseData[i] = t.VDBExecutionDepositsTableRow{
PublicKey: t.PubKey(pubkeys[i]),
Block: uint64(row.BlockNumber),
Timestamp: row.Timestamp.Unix(),
From: t.Address{Hash: t.Hash(hexutil.Encode(row.From))},
TxHash: t.Hash(hexutil.Encode(row.TxHash)),
WithdrawalCredential: t.Hash(hexutil.Encode(row.WithdrawalCredentials)),
Amount: utils.GWeiToWei(big.NewInt(row.Amount)),
Valid: row.Valid,
}
ensMapping[hexutil.Encode(row.From)] = ""
addressMapping[hexutil.Encode(row.From)] = nil
fromContractStatusRequests[i] = db.ContractInteractionAtRequest{
Address: string(row.From),
Block: row.BlockNumber,
Expand All @@ -156,7 +155,7 @@ func (d *DataAccessService) GetValidatorDashboardElDeposits(ctx context.Context,
}
if len(row.Depositor) > 0 {
responseData[i].Depositor = t.Address{Hash: t.Hash(hexutil.Encode(row.Depositor))}
ensMapping[hexutil.Encode(row.Depositor)] = ""
addressMapping[hexutil.Encode(row.Depositor)] = nil
depositorReq := fromContractStatusRequests[i]
depositorReq.Address = string(row.Depositor)
depositorContractStatusRequests = append(depositorContractStatusRequests, depositorReq)
Expand All @@ -169,7 +168,7 @@ func (d *DataAccessService) GetValidatorDashboardElDeposits(ctx context.Context,
}

// populate address data
if err := db.GetEnsNamesForAddresses(ensMapping); err != nil {
if err := d.GetLabelsAndEnsForAddresses(ctx, addressMapping); err != nil {
return nil, nil, err
}
fromContractStatuses, err := d.bigtable.GetAddressContractInteractionsAt(fromContractStatusRequests)
Expand All @@ -182,8 +181,7 @@ func (d *DataAccessService) GetValidatorDashboardElDeposits(ctx context.Context,
}
var depositorIdx int
for i := range data {
responseData[i].From.Ens = ensMapping[string(responseData[i].From.Hash)]
responseData[i].Depositor.Ens = ensMapping[string(responseData[i].Depositor.Hash)]
responseData[i].From = *addressMapping[string(responseData[i].From.Hash)]
responseData[i].From.IsContract = fromContractStatuses[i] == types.CONTRACT_CREATION || fromContractStatuses[i] == types.CONTRACT_PRESENT
responseData[i].Depositor.IsContract = responseData[i].From.IsContract
if responseData[i].Depositor.Hash != responseData[i].From.Hash {
Expand Down
26 changes: 12 additions & 14 deletions backend/pkg/api/data_access/vdb_withdrawals.go
Original file line number Diff line number Diff line change
Expand Up @@ -199,11 +199,11 @@ func (d *DataAccessService) GetValidatorDashboardWithdrawals(ctx context.Context
}

// Prepare the ENS map
addressEns := make(map[string]string)
addressMapping := make(map[string]*t.Address)
contractStatusRequests := make([]db.ContractInteractionAtRequest, len(queryResult))
for i, withdrawal := range queryResult {
address := hexutil.Encode(withdrawal.Address)
addressEns[address] = ""
addressMapping[address] = nil
contractStatusRequests[i] = db.ContractInteractionAtRequest{
Address: string(withdrawal.Address),
Block: int64(withdrawal.BlockNumber),
Expand All @@ -213,7 +213,7 @@ func (d *DataAccessService) GetValidatorDashboardWithdrawals(ctx context.Context
}

// Get the ENS names for the addresses
if err := db.GetEnsNamesForAddresses(addressEns); err != nil {
if err := d.GetLabelsAndEnsForAddresses(ctx, addressMapping); err != nil {
return nil, nil, err
}

Expand All @@ -228,17 +228,14 @@ func (d *DataAccessService) GetValidatorDashboardWithdrawals(ctx context.Context
for i, withdrawal := range queryResult {
address := hexutil.Encode(withdrawal.Address)
result = append(result, t.VDBWithdrawalsTableRow{
Epoch: withdrawal.BlockSlot / utils.Config.Chain.ClConfig.SlotsPerEpoch,
Slot: withdrawal.BlockSlot,
Index: withdrawal.ValidatorIndex,
GroupId: validatorGroupMap[withdrawal.ValidatorIndex],
Recipient: t.Address{
Hash: t.Hash(address),
Ens: addressEns[address],
IsContract: contractStatuses[i] == types.CONTRACT_CREATION || contractStatuses[i] == types.CONTRACT_PRESENT,
},
Amount: utils.GWeiToWei(big.NewInt(int64(withdrawal.Amount))),
Epoch: withdrawal.BlockSlot / utils.Config.Chain.ClConfig.SlotsPerEpoch,
Slot: withdrawal.BlockSlot,
Index: withdrawal.ValidatorIndex,
Recipient: *addressMapping[address],
GroupId: validatorGroupMap[withdrawal.ValidatorIndex],
Amount: utils.GWeiToWei(big.NewInt(int64(withdrawal.Amount))),
})
result[i].Recipient.IsContract = contractStatuses[i] == types.CONTRACT_CREATION || contractStatuses[i] == types.CONTRACT_PRESENT
cursorData = append(cursorData, t.WithdrawalsCursor{
Slot: withdrawal.BlockSlot,
WithdrawalIndex: withdrawal.WithdrawalIndex,
Expand Down Expand Up @@ -273,7 +270,8 @@ func (d *DataAccessService) GetValidatorDashboardWithdrawals(ctx context.Context
if nextData != nil {
// Complete the next data
nextData.GroupId = validatorGroupMap[nextData.Index]
nextData.Recipient.Ens = addressEns[string(nextData.Recipient.Hash)]
// TODO integrate label/ens data for "next" row
// nextData.Recipient.Ens = addressEns[string(nextData.Recipient.Hash)]
} else {
// If there is no next data, add a missing estimate row
nextData = &t.VDBWithdrawalsTableRow{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
-- +goose Up
-- +goose StatementBegin
SELECT('up SQL query - create address_tags table');
CREATE TABLE address_tags (
address bytea NOT NULL UNIQUE,
tag CHARACTER VARYING(100) NOT NULL,
PRIMARY KEY (address, tag)
);
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
SELECT('down SQL query - drop address_tags table');
DROP TABLE execution_payloads;
-- +goose StatementEnd

0 comments on commit 873d06e

Please sign in to comment.