Merge pull request #750 from ethereum/JustinDrake-patch-7

Do not check withdrawal credentials for existing validators
This commit is contained in:
Danny Ryan 2019-03-12 11:22:28 -06:00 committed by GitHub
commit 54fae53ce6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 21 deletions

View File

@ -1288,7 +1288,7 @@ def process_deposit(state: BeaconState, deposit: Deposit) -> None:
serialized_deposit_data = serialize(deposit.deposit_data) serialized_deposit_data = serialize(deposit.deposit_data)
# Deposits must be processed in order # Deposits must be processed in order
assert deposit.index == state.deposit_index assert deposit.index == state.deposit_index
# Verify the Merkle branch # Verify the Merkle branch
merkle_branch_is_valid = verify_merkle_branch( merkle_branch_is_valid = verify_merkle_branch(
leaf=hash(serialized_deposit_data), leaf=hash(serialized_deposit_data),
@ -1298,27 +1298,12 @@ def process_deposit(state: BeaconState, deposit: Deposit) -> None:
root=state.latest_eth1_data.deposit_root, root=state.latest_eth1_data.deposit_root,
) )
assert merkle_branch_is_valid assert merkle_branch_is_valid
# Increment the next deposit index we are expecting. Note that this # Increment the next deposit index we are expecting. Note that this
# needs to be done here because while the deposit contract will never # needs to be done here because while the deposit contract will never
# create an invalid Merkle branch, it may admit an invalid deposit # create an invalid Merkle branch, it may admit an invalid deposit
# object, and we need to be able to skip over it # object, and we need to be able to skip over it
state.deposit_index += 1 state.deposit_index += 1
# Verify the proof of possession
proof_is_valid = bls_verify(
pubkey=deposit_input.pubkey,
message_hash=signed_root(deposit_input),
signature=deposit_input.proof_of_possession,
domain=get_domain(
state.fork,
get_current_epoch(state),
DOMAIN_DEPOSIT,
)
)
if not proof_is_valid:
return
validator_pubkeys = [v.pubkey for v in state.validator_registry] validator_pubkeys = [v.pubkey for v in state.validator_registry]
pubkey = deposit_input.pubkey pubkey = deposit_input.pubkey
@ -1326,6 +1311,20 @@ def process_deposit(state: BeaconState, deposit: Deposit) -> None:
withdrawal_credentials = deposit_input.withdrawal_credentials withdrawal_credentials = deposit_input.withdrawal_credentials
if pubkey not in validator_pubkeys: if pubkey not in validator_pubkeys:
# Verify the proof of possession
proof_is_valid = bls_verify(
pubkey=deposit_input.pubkey,
message_hash=signed_root(deposit_input),
signature=deposit_input.proof_of_possession,
domain=get_domain(
state.fork,
get_current_epoch(state),
DOMAIN_DEPOSIT,
)
)
if not proof_is_valid:
return
# Add new validator # Add new validator
validator = Validator( validator = Validator(
pubkey=pubkey, pubkey=pubkey,
@ -1342,10 +1341,7 @@ def process_deposit(state: BeaconState, deposit: Deposit) -> None:
state.validator_balances.append(amount) state.validator_balances.append(amount)
else: else:
# Increase balance by deposit amount # Increase balance by deposit amount
index = validator_pubkeys.index(pubkey) state.validator_balances[validator_pubkeys.index(pubkey)] += amount
assert state.validator_registry[index].withdrawal_credentials == withdrawal_credentials
state.validator_balances[index] += amount
``` ```
### Routines for updating validator status ### Routines for updating validator status