Skip to content

Commit

Permalink
improve search handling (#303)
Browse files Browse the repository at this point in the history
  • Loading branch information
LuccaBitfly authored May 15, 2024
1 parent 2db765c commit 605dd45
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 47 deletions.
12 changes: 3 additions & 9 deletions backend/pkg/api/data_access/dummy.go
Original file line number Diff line number Diff line change
Expand Up @@ -291,13 +291,13 @@ func (d *DummyService) GetSearchValidatorByIndex(ctx context.Context, chainId, i
return &r, err
}

func (d *DummyService) GetSearchValidatorByPublicKey(ctx context.Context, chainId uint64, publicKey string) (*t.SearchValidator, error) {
func (d *DummyService) GetSearchValidatorByPublicKey(ctx context.Context, chainId uint64, publicKey []byte) (*t.SearchValidator, error) {
r := t.SearchValidator{}
err := commonFakeData(&r)
return &r, err
}

func (d *DummyService) GetSearchValidatorsByDepositAddress(ctx context.Context, chainId uint64, address string) (*t.SearchValidatorsByDepositAddress, error) {
func (d *DummyService) GetSearchValidatorsByDepositAddress(ctx context.Context, chainId uint64, address []byte) (*t.SearchValidatorsByDepositAddress, error) {
r := t.SearchValidatorsByDepositAddress{}
err := commonFakeData(&r)
return &r, err
Expand All @@ -309,18 +309,12 @@ func (d *DummyService) GetSearchValidatorsByDepositEnsName(ctx context.Context,
return &r, err
}

func (d *DummyService) GetSearchValidatorsByWithdrawalCredential(ctx context.Context, chainId uint64, credential string) (*t.SearchValidatorsByWithdrwalCredential, error) {
func (d *DummyService) GetSearchValidatorsByWithdrawalCredential(ctx context.Context, chainId uint64, credential []byte) (*t.SearchValidatorsByWithdrwalCredential, error) {
r := t.SearchValidatorsByWithdrwalCredential{}
err := commonFakeData(&r)
return &r, err
}

func (d *DummyService) GetSearchValidatorsByWithdrawalAddress(ctx context.Context, chainId uint64, address string) (*t.SearchValidatorsByDepositAddress, error) {
r := t.SearchValidatorsByDepositAddress{}
err := commonFakeData(&r)
return &r, err
}

func (d *DummyService) GetSearchValidatorsByWithdrawalEnsName(ctx context.Context, chainId uint64, ensName string) (*t.SearchValidatorsByWithrawalEnsName, error) {
r := t.SearchValidatorsByWithrawalEnsName{}
err := commonFakeData(&r)
Expand Down
18 changes: 6 additions & 12 deletions backend/pkg/api/data_access/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@ import (

type SearchRepository interface {
GetSearchValidatorByIndex(ctx context.Context, chainId, index uint64) (*t.SearchValidator, error)
GetSearchValidatorByPublicKey(ctx context.Context, chainId uint64, publicKey string) (*t.SearchValidator, error)
GetSearchValidatorsByDepositAddress(ctx context.Context, chainId uint64, address string) (*t.SearchValidatorsByDepositAddress, error)
GetSearchValidatorByPublicKey(ctx context.Context, chainId uint64, publicKey []byte) (*t.SearchValidator, error)
GetSearchValidatorsByDepositAddress(ctx context.Context, chainId uint64, address []byte) (*t.SearchValidatorsByDepositAddress, error)
GetSearchValidatorsByDepositEnsName(ctx context.Context, chainId uint64, ensName string) (*t.SearchValidatorsByDepositEnsName, error)
GetSearchValidatorsByWithdrawalCredential(ctx context.Context, chainId uint64, credential string) (*t.SearchValidatorsByWithdrwalCredential, error)
GetSearchValidatorsByWithdrawalAddress(ctx context.Context, chainId uint64, address string) (*t.SearchValidatorsByDepositAddress, error)
GetSearchValidatorsByWithdrawalCredential(ctx context.Context, chainId uint64, credential []byte) (*t.SearchValidatorsByWithdrwalCredential, error)
GetSearchValidatorsByWithdrawalEnsName(ctx context.Context, chainId uint64, ensName string) (*t.SearchValidatorsByWithrawalEnsName, error)
GetSearchValidatorsByGraffiti(ctx context.Context, chainId uint64, graffiti string) (*t.SearchValidatorsByGraffiti, error)
}
Expand All @@ -22,12 +21,12 @@ func (d *DataAccessService) GetSearchValidatorByIndex(ctx context.Context, chain
return d.dummy.GetSearchValidatorByIndex(ctx, chainId, index)
}

func (d *DataAccessService) GetSearchValidatorByPublicKey(ctx context.Context, chainId uint64, publicKey string) (*t.SearchValidator, error) {
func (d *DataAccessService) GetSearchValidatorByPublicKey(ctx context.Context, chainId uint64, publicKey []byte) (*t.SearchValidator, error) {
// TODO: @recy21
return d.dummy.GetSearchValidatorByPublicKey(ctx, chainId, publicKey)
}

func (d *DataAccessService) GetSearchValidatorsByDepositAddress(ctx context.Context, chainId uint64, address string) (*t.SearchValidatorsByDepositAddress, error) {
func (d *DataAccessService) GetSearchValidatorsByDepositAddress(ctx context.Context, chainId uint64, address []byte) (*t.SearchValidatorsByDepositAddress, error) {
// TODO: @recy21
return d.dummy.GetSearchValidatorsByDepositAddress(ctx, chainId, address)
}
Expand All @@ -37,16 +36,11 @@ func (d *DataAccessService) GetSearchValidatorsByDepositEnsName(ctx context.Cont
return d.dummy.GetSearchValidatorsByDepositEnsName(ctx, chainId, ensName)
}

func (d *DataAccessService) GetSearchValidatorsByWithdrawalCredential(ctx context.Context, chainId uint64, credential string) (*t.SearchValidatorsByWithdrwalCredential, error) {
func (d *DataAccessService) GetSearchValidatorsByWithdrawalCredential(ctx context.Context, chainId uint64, credential []byte) (*t.SearchValidatorsByWithdrwalCredential, error) {
// TODO: @recy21
return d.dummy.GetSearchValidatorsByWithdrawalCredential(ctx, chainId, credential)
}

func (d *DataAccessService) GetSearchValidatorsByWithdrawalAddress(ctx context.Context, chainId uint64, address string) (*t.SearchValidatorsByDepositAddress, error) {
// TODO: @recy21
return d.dummy.GetSearchValidatorsByWithdrawalAddress(ctx, chainId, address)
}

func (d *DataAccessService) GetSearchValidatorsByWithdrawalEnsName(ctx context.Context, chainId uint64, ensName string) (*t.SearchValidatorsByWithrawalEnsName, error) {
// TODO: @recy21
return d.dummy.GetSearchValidatorsByWithdrawalEnsName(ctx, chainId, ensName)
Expand Down
24 changes: 12 additions & 12 deletions backend/pkg/api/handlers/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,17 @@ var allNetworks []types.NetworkInfo

var (
// Subject to change, just examples
reName = regexp.MustCompile(`^[a-zA-Z0-9_\-.\ ]+$`)
reNumber = regexp.MustCompile(`^[0-9]+$`)
reValidatorDashboardPublicId = regexp.MustCompile(`^v-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`)
reValidatorPublicKey = regexp.MustCompile(`^0x[0-9a-fA-F]{96}$`)
reEthereumAddress = regexp.MustCompile(`^0x[0-9a-fA-F]{40}$`)
reWithdrawalCredential = regexp.MustCompile(`^0x00[0-9a-fA-F]{62}$`)
reWithdrawalAddress = regexp.MustCompile(`^0x01[0-9a-fA-F]{62}$`)
reEnsName = regexp.MustCompile(`^.+\.eth$`)
reNonEmpty = regexp.MustCompile(`^\s*\S.*$`)
reCursor = regexp.MustCompile(`^[A-Za-z0-9-_]+$`) // has to be base64
reEmail = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
reName = regexp.MustCompile(`^[a-zA-Z0-9_\-.\ ]+$`)
reNumber = regexp.MustCompile(`^[0-9]+$`)
reValidatorDashboardPublicId = regexp.MustCompile(`^v-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`)
reValidatorPublicKeyWithPrefix = regexp.MustCompile(`^0x[0-9a-fA-F]{96}$`)
reValidatorPublicKey = regexp.MustCompile(`^(0x)?[0-9a-fA-F]{96}$`)
reEthereumAddress = regexp.MustCompile(`^(0x)?[0-9a-fA-F]{40}$`)
reWithdrawalCredential = regexp.MustCompile(`^(0x0[01])?[0-9a-fA-F]{62}$`)
reEnsName = regexp.MustCompile(`^.+\.eth$`)
reNonEmpty = regexp.MustCompile(`^\s*\S.*$`)
reCursor = regexp.MustCompile(`^[A-Za-z0-9-_]+$`) // has to be base64
reEmail = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
)

const (
Expand Down Expand Up @@ -425,7 +425,7 @@ func (v *validationError) checkValidatorArray(validators []string, allowEmpty bo
for _, validator := range validators {
if reNumber.MatchString(validator) {
indexes = append(indexes, v.checkUint(validator, "validators"))
} else if reValidatorPublicKey.MatchString(validator) {
} else if reValidatorPublicKeyWithPrefix.MatchString(validator) {
_, err := hexutil.Decode(validator)
if err != nil {
v.add("validators", fmt.Sprintf("invalid value '%s' in list of validators", v))
Expand Down
40 changes: 30 additions & 10 deletions backend/pkg/api/handlers/search_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ package handlers

import (
"context"
"encoding/hex"
"errors"
"net/http"
"regexp"
"strconv"
"strings"

"github.com/gobitfly/beaconchain/pkg/api/types"
"golang.org/x/sync/errgroup"
Expand All @@ -32,7 +34,7 @@ var searchTypeToRegex = map[searchTypeKey]*regexp.Regexp{
validatorsByDepositAddress: reEthereumAddress,
validatorsByDepositEnsName: reEnsName,
validatorsByWithdrawalCredential: reWithdrawalCredential,
validatorsByWithdrawalAddress: reWithdrawalAddress,
validatorsByWithdrawalAddress: reEthereumAddress,
validatorsByWithdrawalEns: reEnsName,
validatorsByGraffiti: reNonEmpty,
}
Expand Down Expand Up @@ -163,7 +165,7 @@ func (h *HandlerService) handleSearchValidatorByIndex(ctx context.Context, input
return &types.SearchResult{
Type: string(validatorByIndex),
ChainId: chainId,
HashValue: result.PublicKey,
HashValue: hex.EncodeToString(result.PublicKey),
NumValue: &result.Index,
Validators: []uint64{result.Index},
}, nil
Expand All @@ -175,15 +177,20 @@ func (h *HandlerService) handleSearchValidatorByPublicKey(ctx context.Context, i
case <-ctx.Done():
return nil, nil
default:
result, err := h.dai.GetSearchValidatorByPublicKey(ctx, chainId, input)
publicKey, err := hex.DecodeString(strings.TrimPrefix(input, "0x"))
if err != nil {
// input should've been checked by the regex before, this should never happen
return nil, err
}
result, err := h.dai.GetSearchValidatorByPublicKey(ctx, chainId, publicKey)
if err != nil {
return nil, err
}

return &types.SearchResult{
Type: string(validatorByPublicKey),
ChainId: chainId,
HashValue: result.PublicKey,
HashValue: hex.EncodeToString(result.PublicKey),
NumValue: &result.Index,
Validators: []uint64{result.Index},
}, nil
Expand All @@ -195,15 +202,19 @@ func (h *HandlerService) handleSearchValidatorsByDepositAddress(ctx context.Cont
case <-ctx.Done():
return nil, nil
default:
result, err := h.dai.GetSearchValidatorsByDepositAddress(ctx, chainId, input)
address, err := hex.DecodeString(strings.TrimPrefix(input, "0x"))
if err != nil {
return nil, err
}
result, err := h.dai.GetSearchValidatorsByDepositAddress(ctx, chainId, address)
if err != nil {
return nil, err
}

return &types.SearchResult{
Type: string(validatorsByDepositAddress),
ChainId: chainId,
HashValue: result.Address,
HashValue: hex.EncodeToString(result.Address),
Validators: result.Validators,
}, nil
}
Expand Down Expand Up @@ -233,15 +244,19 @@ func (h *HandlerService) handleSearchValidatorsByWithdrawalCredential(ctx contex
case <-ctx.Done():
return nil, nil
default:
result, err := h.dai.GetSearchValidatorsByWithdrawalCredential(ctx, chainId, input)
withdrawalCredential, err := hex.DecodeString(strings.TrimPrefix(input, "0x"))
if err != nil {
return nil, err
}
result, err := h.dai.GetSearchValidatorsByWithdrawalCredential(ctx, chainId, withdrawalCredential)
if err != nil {
return nil, err
}

return &types.SearchResult{
Type: string(validatorsByWithdrawalCredential),
ChainId: chainId,
HashValue: result.WithdrawalCredential,
HashValue: hex.EncodeToString(result.WithdrawalCredential),
Validators: result.Validators,
}, nil
}
Expand All @@ -252,15 +267,20 @@ func (h *HandlerService) handleSearchValidatorsByWithdrawalAddress(ctx context.C
case <-ctx.Done():
return nil, nil
default:
result, err := h.dai.GetSearchValidatorsByWithdrawalAddress(ctx, chainId, input)
withdrawalString := "010000000000000000000000" + strings.TrimPrefix(input, "0x")
withdrawalCredential, err := hex.DecodeString(withdrawalString)
if err != nil {
return nil, err
}
result, err := h.dai.GetSearchValidatorsByWithdrawalCredential(ctx, chainId, withdrawalCredential)
if err != nil {
return nil, err
}

return &types.SearchResult{
Type: string(validatorsByWithdrawalAddress),
ChainId: chainId,
HashValue: result.Address,
HashValue: hex.EncodeToString(result.WithdrawalCredential),
Validators: result.Validators,
}, nil
}
Expand Down
2 changes: 1 addition & 1 deletion backend/pkg/api/types/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ type ChainConfig struct {
type SearchResult struct {
Type string `json:"type"`
ChainId uint64 `json:"chain_id"`
HashValue Hash `json:"hash_value,omitempty"`
HashValue string `json:"hash_value,omitempty"`
StrValue string `json:"str_value,omitempty"`
NumValue *uint64 `json:"num_value,omitempty"`
Validators []uint64 `json:"validators,omitempty"`
Expand Down
6 changes: 3 additions & 3 deletions backend/pkg/api/types/search_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ package types

type SearchValidator struct {
Index uint64
PublicKey Hash
PublicKey []byte
}

type SearchValidatorsByDepositEnsName struct {
Expand All @@ -13,12 +13,12 @@ type SearchValidatorsByDepositEnsName struct {
}

type SearchValidatorsByDepositAddress struct {
Address Hash
Address []byte
Validators []uint64
}

type SearchValidatorsByWithdrwalCredential struct {
WithdrawalCredential Hash
WithdrawalCredential []byte
Validators []uint64
}

Expand Down

0 comments on commit 605dd45

Please sign in to comment.