Skip to content

Commit

Permalink
Merge branch 'cleanup-newstate' of github.com:prysmaticlabs/prysm int…
Browse files Browse the repository at this point in the history
…o cleanup-newstate
  • Loading branch information
terencechain committed Aug 27, 2020
2 parents 342475a + 77a1e02 commit 3e83468
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 13 deletions.
39 changes: 34 additions & 5 deletions beacon-chain/rpc/validator/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,12 @@ func (vs *Server) validatorStatus(
}
// Mark a validator as DEPOSITED if their deposit is visible.
resp.Status = ethpb.ValidatorStatus_DEPOSITED

// Check if 32 ETH was deposited. If less assign PENDING or PARTIALLY_DEPOSITED status.
if deposit.Data.Amount == 0 {
resp.Status = ethpb.ValidatorStatus_PENDING
} else if deposit.Data.Amount < params.BeaconConfig().MaxEffectiveBalance {
resp.Status = ethpb.ValidatorStatus_PARTIALLY_DEPOSITED
}
resp.Eth1DepositBlockNumber = eth1BlockNumBigInt.Uint64()

depositBlockSlot, err := vs.depositBlockSlot(ctx, headState, eth1BlockNumBigInt)
Expand All @@ -189,8 +194,22 @@ func (vs *Server) validatorStatus(
}
resp.DepositInclusionSlot = depositBlockSlot
return resp, nonExistentIndex
// Deposited and Pending mean the validator has been put into the state.
case ethpb.ValidatorStatus_DEPOSITED, ethpb.ValidatorStatus_PENDING:
// Deposited, Pending or Partialy Deposited mean the validator has been put into the state.
case ethpb.ValidatorStatus_DEPOSITED, ethpb.ValidatorStatus_PENDING, ethpb.ValidatorStatus_PARTIALLY_DEPOSITED:
if resp.Status == ethpb.ValidatorStatus_PENDING {
if vs.DepositFetcher == nil {
log.Warn("Not connected to ETH1. Cannot determine validator ETH1 deposit.")
} else {
// Check if there was a deposit deposit.
deposit, eth1BlockNumBigInt := vs.DepositFetcher.DepositByPubkey(ctx, pubKey)
if eth1BlockNumBigInt != nil && deposit.Data.Amount >= params.BeaconConfig().MaxEffectiveBalance {
resp.Status = ethpb.ValidatorStatus_DEPOSITED
} else if eth1BlockNumBigInt != nil && deposit.Data.Amount > 0 {
resp.Status = ethpb.ValidatorStatus_PARTIALLY_DEPOSITED
}
}
}

var lastActivatedValidatorIdx uint64
for j := headState.NumValidators() - 1; j >= 0; j-- {
val, err := headState.ValidatorAtIndexReadOnly(uint64(j))
Expand Down Expand Up @@ -230,15 +249,25 @@ func assignmentStatus(beaconState *stateTrie.BeaconState, validatorIdx uint64) e
}
currentEpoch := helpers.CurrentEpoch(beaconState)
farFutureEpoch := params.BeaconConfig().FarFutureEpoch
validatorBalance := validator.EffectiveBalance()

if validator == nil {
return ethpb.ValidatorStatus_UNKNOWN_STATUS
}
if currentEpoch < validator.ActivationEligibilityEpoch() {
return ethpb.ValidatorStatus_DEPOSITED
if validatorBalance == 0 {
return ethpb.ValidatorStatus_PENDING
}
if validatorBalance >= params.BeaconConfig().MaxEffectiveBalance {
return ethpb.ValidatorStatus_DEPOSITED
}
return ethpb.ValidatorStatus_PARTIALLY_DEPOSITED
}
if currentEpoch < validator.ActivationEpoch() {
return ethpb.ValidatorStatus_PENDING
if validatorBalance == 0 {
return ethpb.ValidatorStatus_PENDING
}
return ethpb.ValidatorStatus_PARTIALLY_DEPOSITED
}
if validator.ExitEpoch() == farFutureEpoch {
return ethpb.ValidatorStatus_ACTIVE
Expand Down
109 changes: 103 additions & 6 deletions beacon-chain/rpc/validator/status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ func TestValidatorStatus_Deposited(t *testing.T) {

pubKey1 := pubKey(1)
depData := &ethpb.Deposit_Data{
Amount: params.BeaconConfig().MaxEffectiveBalance,
PublicKey: pubKey1,
Signature: bytesutil.PadTo([]byte("hi"), 96),
WithdrawalCredentials: bytesutil.PadTo([]byte("hey"), 32),
Expand Down Expand Up @@ -113,6 +114,58 @@ func TestValidatorStatus_Deposited(t *testing.T) {
assert.Equal(t, ethpb.ValidatorStatus_DEPOSITED, resp.Status)
}

func TestValidatorStatus_PartiallyDeposited(t *testing.T) {
db, _ := dbutil.SetupDB(t)
ctx := context.Background()

pubKey1 := pubKey(1)
depData := &ethpb.Deposit_Data{
Amount: params.BeaconConfig().MinDepositAmount,
PublicKey: pubKey1,
Signature: []byte("hi"),
WithdrawalCredentials: []byte("hey"),
}
deposit := &ethpb.Deposit{
Data: depData,
}
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
require.NoError(t, err, "Could not setup deposit trie")
depositCache, err := depositcache.NewDepositCache()
require.NoError(t, err)

depositCache.InsertDeposit(ctx, deposit, 0 /*blockNum*/, 0, depositTrie.Root())
height := time.Unix(int64(params.BeaconConfig().Eth1FollowDistance), 0).Unix()
p := &mockPOW.POWChain{
TimesByHeight: map[int]uint64{
0: uint64(height),
},
}
stateObj, err := stateTrie.InitializeFromProtoUnsafe(&pbp2p.BeaconState{
Validators: []*ethpb.Validator{
{
PublicKey: pubKey1,
ActivationEligibilityEpoch: 1,
},
},
})
require.NoError(t, err)
vs := &Server{
BeaconDB: db,
DepositFetcher: depositCache,
BlockFetcher: p,
HeadFetcher: &mockChain.ChainService{
State: stateObj,
},
Eth1InfoFetcher: p,
}
req := &ethpb.ValidatorStatusRequest{
PublicKey: pubKey1,
}
resp, err := vs.ValidatorStatus(context.Background(), req)
require.NoError(t, err, "Could not get validator status")
assert.Equal(t, ethpb.ValidatorStatus_PARTIALLY_DEPOSITED, resp.Status)
}

func TestValidatorStatus_Pending(t *testing.T) {
db, _ := dbutil.SetupDB(t)
ctx := context.Background()
Expand Down Expand Up @@ -486,6 +539,7 @@ func TestActivationStatus_OK(t *testing.T) {
ActivationEligibilityEpoch: 700,
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
PublicKey: pubKeys[3],
EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance,
},
},
})
Expand Down Expand Up @@ -782,8 +836,15 @@ func TestMultipleValidatorStatus_Pubkeys(t *testing.T) {
db, _ := dbutil.SetupDB(t)
ctx := context.Background()

deposits, _, err := testutil.DeterministicDepositsAndKeys(4)
pubKeys := [][]byte{deposits[0].Data.PublicKey, deposits[1].Data.PublicKey, deposits[2].Data.PublicKey, deposits[3].Data.PublicKey}
deposits, _, err := testutil.DeterministicDepositsAndKeys(6)
pubKeys := [][]byte{
deposits[0].Data.PublicKey,
deposits[1].Data.PublicKey,
deposits[2].Data.PublicKey,
deposits[3].Data.PublicKey,
deposits[4].Data.PublicKey,
deposits[5].Data.PublicKey,
}
stateObj, err := stateTrie.InitializeFromProtoUnsafe(&pbp2p.BeaconState{
Slot: 4000,
Validators: []*ethpb.Validator{
Expand All @@ -801,18 +862,30 @@ func TestMultipleValidatorStatus_Pubkeys(t *testing.T) {
ActivationEligibilityEpoch: 700,
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
PublicKey: pubKeys[3],
EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance,
},
{
ActivationEligibilityEpoch: 700,
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
PublicKey: pubKeys[4],
EffectiveBalance: params.BeaconConfig().MinDepositAmount,
},
{
ActivationEligibilityEpoch: 700,
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
PublicKey: pubKeys[5],
},
},
})
block := testutil.NewBeaconBlock()
genesisRoot, err := block.Block.HashTreeRoot()
require.NoError(t, err, "Could not get signing root")
dep := deposits[0]
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
require.NoError(t, err, "Could not setup deposit trie")
depositCache, err := depositcache.NewDepositCache()
require.NoError(t, err)

dep := deposits[0]
depositCache.InsertDeposit(ctx, dep, 10 /*blockNum*/, 0, depositTrie.Root())
dep = deposits[2]
depositTrie.Insert(dep.Data.Signature, 15)
Expand Down Expand Up @@ -845,6 +918,12 @@ func TestMultipleValidatorStatus_Pubkeys(t *testing.T) {
{
Status: ethpb.ValidatorStatus_DEPOSITED,
},
{
Status: ethpb.ValidatorStatus_PARTIALLY_DEPOSITED,
},
{
Status: ethpb.ValidatorStatus_PENDING,
},
}

req := &ethpb.MultipleValidatorStatusRequest{PublicKeys: pubKeys}
Expand All @@ -867,7 +946,7 @@ func TestMultipleValidatorStatus_Indices(t *testing.T) {
db, _ := dbutil.SetupDB(t)
slot := uint64(10000)
epoch := helpers.SlotToEpoch(slot)
pubKeys := [][]byte{pubKey(1), pubKey(2), pubKey(3), pubKey(4)}
pubKeys := [][]byte{pubKey(1), pubKey(2), pubKey(3), pubKey(4), pubKey(5), pubKey(6), pubKey(7)}
beaconState := &pbp2p.BeaconState{
Slot: 4000,
Validators: []*ethpb.Validator{
Expand All @@ -885,12 +964,24 @@ func TestMultipleValidatorStatus_Indices(t *testing.T) {
ActivationEligibilityEpoch: 700,
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
PublicKey: pubKeys[2],
EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance,
},
{
Slashed: true,
ExitEpoch: epoch + 1,
PublicKey: pubKeys[3],
},
{
ActivationEligibilityEpoch: 700,
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
PublicKey: pubKeys[4],
EffectiveBalance: params.BeaconConfig().MinDepositAmount,
},
{
ActivationEligibilityEpoch: 700,
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
PublicKey: pubKeys[5],
},
},
}
stateObj, err := stateTrie.InitializeFromProtoUnsafe(beaconState)
Expand Down Expand Up @@ -922,10 +1013,16 @@ func TestMultipleValidatorStatus_Indices(t *testing.T) {
{
Status: ethpb.ValidatorStatus_SLASHING,
},
{
Status: ethpb.ValidatorStatus_PARTIALLY_DEPOSITED,
},
{
Status: ethpb.ValidatorStatus_PENDING,
},
}

// Note: Index 4 should be skipped.
req := &ethpb.MultipleValidatorStatusRequest{Indices: []int64{0, 1, 2, 3, 4}}
// Note: Index 6 should be skipped.
req := &ethpb.MultipleValidatorStatusRequest{Indices: []int64{0, 1, 2, 3, 4, 5, 6}}
response, err := vs.MultipleValidatorStatus(context.Background(), req)
require.NoError(t, err)

Expand Down
2 changes: 1 addition & 1 deletion beacon-chain/state/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go_library(
name = "go_default_library",
srcs = [
"cloners.go",
"docs.go",
"doc.go",
"field_trie.go",
"getters.go",
"setters.go",
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion shared/bls/herumi/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ load("@prysm//tools/go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = [
"docs.go",
"doc.go",
"init.go",
"public_key.go",
"secret_key.go",
Expand Down
File renamed without changes.

0 comments on commit 3e83468

Please sign in to comment.