Merge pull request #1137 from ethereum/v06x

Bugfix and additional test to release
This commit is contained in:
Danny Ryan 2019-06-03 11:09:58 -06:00 committed by GitHub
commit cb9301a9fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 7 deletions

View File

@ -1681,7 +1681,7 @@ def process_attester_slashing(state: BeaconState,
slashed_any = False slashed_any = False
attesting_indices_1 = attestation_1.custody_bit_0_indices + attestation_1.custody_bit_1_indices attesting_indices_1 = attestation_1.custody_bit_0_indices + attestation_1.custody_bit_1_indices
attesting_indices_2 = attestation_2.custody_bit_0_indices + attestation_2.custody_bit_1_indices attesting_indices_2 = attestation_2.custody_bit_0_indices + attestation_2.custody_bit_1_indices
for index in set(attesting_indices_1).intersection(attesting_indices_2): for index in sorted(set(attesting_indices_1).intersection(attesting_indices_2)):
if is_slashable_validator(state.validator_registry[index], get_current_epoch(state)): if is_slashable_validator(state.validator_registry[index], get_current_epoch(state)):
slash_validator(state, index) slash_validator(state, index)
slashed_any = True slashed_any = True

View File

@ -93,6 +93,22 @@ def test_invalid_sig_top_up(state):
yield from run_deposit_processing(state, deposit, validator_index, valid=True, effective=True) yield from run_deposit_processing(state, deposit, validator_index, valid=True, effective=True)
@spec_state_test
def test_invalid_withdrawal_credentials_top_up(state):
validator_index = 0
amount = spec.MAX_EFFECTIVE_BALANCE // 4
withdrawal_credentials = spec.BLS_WITHDRAWAL_PREFIX_BYTE + spec.hash(b"junk")[1:]
deposit = prepare_state_and_deposit(
state,
validator_index,
amount,
withdrawal_credentials=withdrawal_credentials,
)
# inconsistent withdrawal credentials, in top-ups, are allowed!
yield from run_deposit_processing(state, deposit, validator_index, valid=True, effective=True)
@spec_state_test @spec_state_test
def test_wrong_index(state): def test_wrong_index(state):
validator_index = len(state.validator_registry) validator_index = len(state.validator_registry)

View File

@ -8,11 +8,10 @@ from eth2spec.utils.merkle_minimal import calc_merkle_tree_from_leaves, get_merk
from eth2spec.utils.minimal_ssz import signing_root from eth2spec.utils.minimal_ssz import signing_root
def build_deposit_data(state, pubkey, privkey, amount, signed=False): def build_deposit_data(state, pubkey, privkey, amount, withdrawal_credentials, signed=False):
deposit_data = DepositData( deposit_data = DepositData(
pubkey=pubkey, pubkey=pubkey,
# insecurely use pubkey as withdrawal key as well withdrawal_credentials=withdrawal_credentials,
withdrawal_credentials=spec.BLS_WITHDRAWAL_PREFIX_BYTE + spec.hash(pubkey)[1:],
amount=amount, amount=amount,
) )
if signed: if signed:
@ -37,8 +36,9 @@ def build_deposit(state,
pubkey, pubkey,
privkey, privkey,
amount, amount,
withdrawal_credentials,
signed): signed):
deposit_data = build_deposit_data(state, pubkey, privkey, amount, signed) deposit_data = build_deposit_data(state, pubkey, privkey, amount, withdrawal_credentials, signed)
item = deposit_data.hash_tree_root() item = deposit_data.hash_tree_root()
index = len(deposit_data_leaves) index = len(deposit_data_leaves)
@ -57,7 +57,7 @@ def build_deposit(state,
return deposit, root, deposit_data_leaves return deposit, root, deposit_data_leaves
def prepare_state_and_deposit(state, validator_index, amount, signed=False): def prepare_state_and_deposit(state, validator_index, amount, withdrawal_credentials=None, signed=False):
""" """
Prepare the state for the deposit, and create a deposit for the given validator, depositing the given amount. Prepare the state for the deposit, and create a deposit for the given validator, depositing the given amount.
""" """
@ -67,13 +67,19 @@ def prepare_state_and_deposit(state, validator_index, amount, signed=False):
pubkey = pubkeys[validator_index] pubkey = pubkeys[validator_index]
privkey = privkeys[validator_index] privkey = privkeys[validator_index]
# insecurely use pubkey as withdrawal key if no credentials provided
if withdrawal_credentials is None:
withdrawal_credentials = spec.BLS_WITHDRAWAL_PREFIX_BYTE + spec.hash(pubkey)[1:]
deposit, root, deposit_data_leaves = build_deposit( deposit, root, deposit_data_leaves = build_deposit(
state, state,
deposit_data_leaves, deposit_data_leaves,
pubkey, pubkey,
privkey, privkey,
amount, amount,
signed withdrawal_credentials,
signed,
) )
state.latest_eth1_data.deposit_root = root state.latest_eth1_data.deposit_root = root