Skip to content

Commit

Permalink
Resolve Web UI Beta Testing Bugs (#7471)
Browse files Browse the repository at this point in the history
* more descriptive password validation error

* include change wallet password fixes

* balance and jwt improvements

* allow for different wallet dirs specified on startup

* ensure wallet password is always validated

* fix up prysm tests

* gaz

* test pass

* pass balances tests

* wrap up fixes

* radek feedback

* fix up tests

* cors fix

* add tests for validator status

* pass tests

* fix n

* skip content type test

* package level cache and send over feed

* package level cache for derived

* all tests passing

* gofmt

Co-authored-by: Preston Van Loon <preston@prysmaticlabs.com>
Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com>
  • Loading branch information
3 people authored Oct 10, 2020
1 parent c4e64af commit 551b03d
Show file tree
Hide file tree
Showing 35 changed files with 1,255 additions and 1,004 deletions.
2 changes: 1 addition & 1 deletion beacon-chain/flags/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ var (
Name: "grpc-gateway-corsdomain",
Usage: "Comma separated list of domains from which to accept cross origin requests " +
"(browser enforced). This flag has no effect if not used with --grpc-gateway-port.",
Value: "http://localhost:4242,http://127.0.0.1:4242",
Value: "http://localhost:4242,http://127.0.0.1:4242,http://localhost:4200",
}
// MinSyncPeers specifies the required number of successful peer handshakes in order
// to start syncing with external peers.
Expand Down
33 changes: 32 additions & 1 deletion beacon-chain/rpc/beacon/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,18 +80,20 @@ func (bs *Server) ListValidatorBalances(
})
continue
}

filtered[index] = true

if index >= uint64(len(balances)) {
return nil, status.Errorf(codes.OutOfRange, "Validator index %d >= balance list %d",
index, len(balances))
}

val := validators[index]
st := validatorStatus(val, requestedEpoch)
res = append(res, &ethpb.ValidatorBalances_Balance{
PublicKey: pubKey,
Index: index,
Balance: balances[index],
Status: st.String(),
})
balancesCount = len(res)
}
Expand All @@ -103,10 +105,13 @@ func (bs *Server) ListValidatorBalances(
}

if !filtered[index] {
val := validators[index]
st := validatorStatus(val, requestedEpoch)
res = append(res, &ethpb.ValidatorBalances_Balance{
PublicKey: validators[index].PublicKey,
Index: index,
Balance: balances[index],
Status: st.String(),
})
}
balancesCount = len(res)
Expand Down Expand Up @@ -140,10 +145,13 @@ func (bs *Server) ListValidatorBalances(
// Return everything.
for i := start; i < end; i++ {
pubkey := requestedState.PubkeyAtIndex(uint64(i))
val := validators[i]
st := validatorStatus(val, requestedEpoch)
res = append(res, &ethpb.ValidatorBalances_Balance{
PublicKey: pubkey[:],
Index: uint64(i),
Balance: balances[i],
Status: st.String(),
})
}
return &ethpb.ValidatorBalances{
Expand Down Expand Up @@ -838,3 +846,26 @@ func validatorHasExited(validator *ethpb.Validator, currentEpoch uint64) bool {
}
return true
}

func validatorStatus(validator *ethpb.Validator, epoch uint64) ethpb.ValidatorStatus {
farFutureEpoch := params.BeaconConfig().FarFutureEpoch
if validator == nil {
return ethpb.ValidatorStatus_UNKNOWN_STATUS
}
if epoch < validator.ActivationEligibilityEpoch {
return ethpb.ValidatorStatus_DEPOSITED
}
if epoch < validator.ActivationEpoch {
return ethpb.ValidatorStatus_PENDING
}
if validator.ExitEpoch == farFutureEpoch {
return ethpb.ValidatorStatus_ACTIVE
}
if epoch < validator.ExitEpoch {
if validator.Slashed {
return ethpb.ValidatorStatus_SLASHING
}
return ethpb.ValidatorStatus_EXITING
}
return ethpb.ValidatorStatus_EXITED
}
134 changes: 109 additions & 25 deletions beacon-chain/rpc/beacon/validators_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ func TestServer_ListValidatorBalances_DefaultResponse_NoArchive(t *testing.T) {
PublicKey: pubKey(uint64(i)),
Index: uint64(i),
Balance: params.BeaconConfig().MaxEffectiveBalance,
Status: "EXITED",
}
}
st := testutil.NewBeaconState()
Expand Down Expand Up @@ -246,7 +247,7 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) {
{req: &ethpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(99)}, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 99, PublicKey: pubKey(99), Balance: 99},
{Index: 99, PublicKey: pubKey(99), Balance: 99, Status: "EXITED"},
},
NextPageToken: "",
TotalSize: 1,
Expand All @@ -255,9 +256,9 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) {
{req: &ethpb.ListValidatorBalancesRequest{Indices: []uint64{1, 2, 3}, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 1, PublicKey: pubKey(1), Balance: 1},
{Index: 2, PublicKey: pubKey(2), Balance: 2},
{Index: 3, PublicKey: pubKey(3), Balance: 3},
{Index: 1, PublicKey: pubKey(1), Balance: 1, Status: "EXITED"},
{Index: 2, PublicKey: pubKey(2), Balance: 2, Status: "EXITED"},
{Index: 3, PublicKey: pubKey(3), Balance: 3, Status: "EXITED"},
},
NextPageToken: "",
TotalSize: 3,
Expand All @@ -266,28 +267,28 @@ func TestServer_ListValidatorBalances_Pagination_Default(t *testing.T) {
{req: &ethpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(10), pubKey(11), pubKey(12)}, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 10, PublicKey: pubKey(10), Balance: 10},
{Index: 11, PublicKey: pubKey(11), Balance: 11},
{Index: 12, PublicKey: pubKey(12), Balance: 12},
{Index: 10, PublicKey: pubKey(10), Balance: 10, Status: "EXITED"},
{Index: 11, PublicKey: pubKey(11), Balance: 11, Status: "EXITED"},
{Index: 12, PublicKey: pubKey(12), Balance: 12, Status: "EXITED"},
},
NextPageToken: "",
TotalSize: 3,
}},
{req: &ethpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{pubKey(2), pubKey(3)}, Indices: []uint64{3, 4}, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, // Duplication
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 2, PublicKey: pubKey(2), Balance: 2},
{Index: 3, PublicKey: pubKey(3), Balance: 3},
{Index: 4, PublicKey: pubKey(4), Balance: 4},
{Index: 2, PublicKey: pubKey(2), Balance: 2, Status: "EXITED"},
{Index: 3, PublicKey: pubKey(3), Balance: 3, Status: "EXITED"},
{Index: 4, PublicKey: pubKey(4), Balance: 4, Status: "EXITED"},
},
NextPageToken: "",
TotalSize: 3,
}},
{req: &ethpb.ListValidatorBalancesRequest{PublicKeys: [][]byte{{}}, Indices: []uint64{3, 4}, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}}, // Public key has a blank value
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 3, PublicKey: pubKey(3), Balance: 3},
{Index: 4, PublicKey: pubKey(4), Balance: 4},
{Index: 3, PublicKey: pubKey(3), Balance: 3, Status: "EXITED"},
{Index: 4, PublicKey: pubKey(4), Balance: 4, Status: "EXITED"},
},
NextPageToken: "",
TotalSize: 2,
Expand Down Expand Up @@ -331,35 +332,35 @@ func TestServer_ListValidatorBalances_Pagination_CustomPageSizes(t *testing.T) {
{req: &ethpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(1), PageSize: 3, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{PublicKey: pubKey(3), Index: 3, Balance: uint64(3)},
{PublicKey: pubKey(4), Index: 4, Balance: uint64(4)},
{PublicKey: pubKey(5), Index: 5, Balance: uint64(5)}},
{PublicKey: pubKey(3), Index: 3, Balance: uint64(3), Status: "EXITED"},
{PublicKey: pubKey(4), Index: 4, Balance: uint64(4), Status: "EXITED"},
{PublicKey: pubKey(5), Index: 5, Balance: uint64(5), Status: "EXITED"}},
NextPageToken: strconv.Itoa(2),
TotalSize: int32(count)}},
{req: &ethpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(10), PageSize: 5, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{PublicKey: pubKey(50), Index: 50, Balance: uint64(50)},
{PublicKey: pubKey(51), Index: 51, Balance: uint64(51)},
{PublicKey: pubKey(52), Index: 52, Balance: uint64(52)},
{PublicKey: pubKey(53), Index: 53, Balance: uint64(53)},
{PublicKey: pubKey(54), Index: 54, Balance: uint64(54)}},
{PublicKey: pubKey(50), Index: 50, Balance: uint64(50), Status: "EXITED"},
{PublicKey: pubKey(51), Index: 51, Balance: uint64(51), Status: "EXITED"},
{PublicKey: pubKey(52), Index: 52, Balance: uint64(52), Status: "EXITED"},
{PublicKey: pubKey(53), Index: 53, Balance: uint64(53), Status: "EXITED"},
{PublicKey: pubKey(54), Index: 54, Balance: uint64(54), Status: "EXITED"}},
NextPageToken: strconv.Itoa(11),
TotalSize: int32(count)}},
{req: &ethpb.ListValidatorBalancesRequest{PageToken: strconv.Itoa(33), PageSize: 3, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{PublicKey: pubKey(99), Index: 99, Balance: uint64(99)},
{PublicKey: pubKey(100), Index: 100, Balance: uint64(100)},
{PublicKey: pubKey(101), Index: 101, Balance: uint64(101)},
{PublicKey: pubKey(99), Index: 99, Balance: uint64(99), Status: "EXITED"},
{PublicKey: pubKey(100), Index: 100, Balance: uint64(100), Status: "EXITED"},
{PublicKey: pubKey(101), Index: 101, Balance: uint64(101), Status: "EXITED"},
},
NextPageToken: "34",
TotalSize: int32(count)}},
{req: &ethpb.ListValidatorBalancesRequest{PageSize: 2, QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{Epoch: 0}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{PublicKey: pubKey(0), Index: 0, Balance: uint64(0)},
{PublicKey: pubKey(1), Index: 1, Balance: uint64(1)}},
{PublicKey: pubKey(0), Index: 0, Balance: uint64(0), Status: "EXITED"},
{PublicKey: pubKey(1), Index: 1, Balance: uint64(1), Status: "EXITED"}},
NextPageToken: strconv.Itoa(1),
TotalSize: int32(count)}},
}
Expand Down Expand Up @@ -1901,3 +1902,86 @@ func TestServer_GetIndividualVotes_Working(t *testing.T) {
}
assert.DeepEqual(t, wanted, res, "Unexpected response")
}

func Test_validatorStatus(t *testing.T) {
tests := []struct {
name string
validator *ethpb.Validator
epoch uint64
want ethpb.ValidatorStatus
}{
{
name: "Unknown",
validator: nil,
epoch: 0,
want: ethpb.ValidatorStatus_UNKNOWN_STATUS,
},
{
name: "Deposited",
validator: &ethpb.Validator{
ActivationEligibilityEpoch: uint64(1),
},
epoch: 0,
want: ethpb.ValidatorStatus_DEPOSITED,
},
{
name: "Pending",
validator: &ethpb.Validator{
ActivationEligibilityEpoch: uint64(0),
ActivationEpoch: uint64(1),
},
epoch: 0,
want: ethpb.ValidatorStatus_PENDING,
},
{
name: "Active",
validator: &ethpb.Validator{
ActivationEligibilityEpoch: uint64(0),
ActivationEpoch: uint64(0),
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
},
epoch: 0,
want: ethpb.ValidatorStatus_ACTIVE,
},
{
name: "Slashed",
validator: &ethpb.Validator{
ActivationEligibilityEpoch: uint64(0),
ActivationEpoch: uint64(0),
ExitEpoch: uint64(5),
Slashed: true,
},
epoch: 4,
want: ethpb.ValidatorStatus_SLASHING,
},
{
name: "Exiting",
validator: &ethpb.Validator{
ActivationEligibilityEpoch: uint64(0),
ActivationEpoch: uint64(0),
ExitEpoch: uint64(5),
Slashed: false,
},
epoch: 4,
want: ethpb.ValidatorStatus_EXITING,
},
{
name: "Exiting",
validator: &ethpb.Validator{
ActivationEligibilityEpoch: uint64(0),
ActivationEpoch: uint64(0),
ExitEpoch: uint64(3),
Slashed: false,
},
epoch: 4,
want: ethpb.ValidatorStatus_EXITED,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := validatorStatus(tt.validator, tt.epoch); got != tt.want {
t.Errorf("validatorStatus() = %v, want %v", got, tt.want)
}
})
}
}
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1217,6 +1217,7 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go4.org v0.0.0-20180809161055-417644f6feb5 h1:+hE86LblG4AyDgwMCLTE6FOlM9+qjHSYS+rKqxUVdsM=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
Expand Down
Loading

0 comments on commit 551b03d

Please sign in to comment.