/ test_libs / pyspec / eth2spec / test / block_processing / test_process_attester_slashing.py
test_process_attester_slashing.py
  1  import eth2spec.phase0.spec as spec
  2  from eth2spec.phase0.spec import (
  3      get_beacon_proposer_index,
  4      process_attester_slashing,
  5  )
  6  from eth2spec.test.context import spec_state_test, expect_assertion_error, always_bls
  7  from eth2spec.test.helpers.attestations import sign_indexed_attestation
  8  from eth2spec.test.helpers.attester_slashings import get_valid_attester_slashing
  9  from eth2spec.test.helpers.block import apply_empty_block
 10  from eth2spec.test.helpers.state import (
 11      get_balance,
 12      next_epoch,
 13  )
 14  
 15  
 16  def run_attester_slashing_processing(state, attester_slashing, valid=True):
 17      """
 18      Run ``process_attester_slashing``, yielding:
 19        - pre-state ('pre')
 20        - attester_slashing ('attester_slashing')
 21        - post-state ('post').
 22      If ``valid == False``, run expecting ``AssertionError``
 23      """
 24  
 25      yield 'pre', state
 26      yield 'attester_slashing', attester_slashing
 27  
 28      if not valid:
 29          expect_assertion_error(lambda: process_attester_slashing(state, attester_slashing))
 30          yield 'post', None
 31          return
 32  
 33      slashed_index = attester_slashing.attestation_1.custody_bit_0_indices[0]
 34      pre_slashed_balance = get_balance(state, slashed_index)
 35  
 36      proposer_index = get_beacon_proposer_index(state)
 37      pre_proposer_balance = get_balance(state, proposer_index)
 38  
 39      # Process slashing
 40      process_attester_slashing(state, attester_slashing)
 41  
 42      slashed_validator = state.validator_registry[slashed_index]
 43  
 44      # Check slashing
 45      assert slashed_validator.slashed
 46      assert slashed_validator.exit_epoch < spec.FAR_FUTURE_EPOCH
 47      assert slashed_validator.withdrawable_epoch < spec.FAR_FUTURE_EPOCH
 48  
 49      if slashed_index != proposer_index:
 50          # lost whistleblower reward
 51          assert get_balance(state, slashed_index) < pre_slashed_balance
 52          # gained whistleblower reward
 53          assert get_balance(state, proposer_index) > pre_proposer_balance
 54      else:
 55          # gained rewards for all slashings, which may include others. And only lost that of themselves.
 56          # Netto at least 0, if more people where slashed, a balance increase.
 57          assert get_balance(state, slashed_index) >= pre_slashed_balance
 58  
 59      yield 'post', state
 60  
 61  
 62  @spec_state_test
 63  def test_success_double(state):
 64      attester_slashing = get_valid_attester_slashing(state, signed_1=True, signed_2=True)
 65  
 66      yield from run_attester_slashing_processing(state, attester_slashing)
 67  
 68  
 69  @spec_state_test
 70  def test_success_surround(state):
 71      next_epoch(state)
 72      apply_empty_block(state)
 73  
 74      state.current_justified_epoch += 1
 75      attester_slashing = get_valid_attester_slashing(state, signed_1=False, signed_2=True)
 76  
 77      # set attestion1 to surround attestation 2
 78      attester_slashing.attestation_1.data.source_epoch = attester_slashing.attestation_2.data.source_epoch - 1
 79      attester_slashing.attestation_1.data.target_epoch = attester_slashing.attestation_2.data.target_epoch + 1
 80  
 81      sign_indexed_attestation(state, attester_slashing.attestation_1)
 82  
 83      yield from run_attester_slashing_processing(state, attester_slashing)
 84  
 85  
 86  @always_bls
 87  @spec_state_test
 88  def test_invalid_sig_1(state):
 89      attester_slashing = get_valid_attester_slashing(state, signed_1=False, signed_2=True)
 90      yield from run_attester_slashing_processing(state, attester_slashing, False)
 91  
 92  
 93  @always_bls
 94  @spec_state_test
 95  def test_invalid_sig_2(state):
 96      attester_slashing = get_valid_attester_slashing(state, signed_1=True, signed_2=False)
 97      yield from run_attester_slashing_processing(state, attester_slashing, False)
 98  
 99  
100  @always_bls
101  @spec_state_test
102  def test_invalid_sig_1_and_2(state):
103      attester_slashing = get_valid_attester_slashing(state, signed_1=False, signed_2=False)
104      yield from run_attester_slashing_processing(state, attester_slashing, False)
105  
106  
107  @spec_state_test
108  def test_same_data(state):
109      attester_slashing = get_valid_attester_slashing(state, signed_1=False, signed_2=True)
110  
111      attester_slashing.attestation_1.data = attester_slashing.attestation_2.data
112      sign_indexed_attestation(state, attester_slashing.attestation_1)
113  
114      yield from run_attester_slashing_processing(state, attester_slashing, False)
115  
116  
117  @spec_state_test
118  def test_no_double_or_surround(state):
119      attester_slashing = get_valid_attester_slashing(state, signed_1=False, signed_2=True)
120  
121      attester_slashing.attestation_1.data.target_epoch += 1
122      sign_indexed_attestation(state, attester_slashing.attestation_1)
123  
124      yield from run_attester_slashing_processing(state, attester_slashing, False)
125  
126  
127  @spec_state_test
128  def test_participants_already_slashed(state):
129      attester_slashing = get_valid_attester_slashing(state, signed_1=True, signed_2=True)
130  
131      # set all indices to slashed
132      attestation_1 = attester_slashing.attestation_1
133      validator_indices = attestation_1.custody_bit_0_indices + attestation_1.custody_bit_1_indices
134      for index in validator_indices:
135          state.validator_registry[index].slashed = True
136  
137      yield from run_attester_slashing_processing(state, attester_slashing, False)
138  
139  
140  @spec_state_test
141  def test_custody_bit_0_and_1(state):
142      attester_slashing = get_valid_attester_slashing(state, signed_1=False, signed_2=True)
143  
144      attester_slashing.attestation_1.custody_bit_1_indices = (
145          attester_slashing.attestation_1.custody_bit_0_indices
146      )
147      sign_indexed_attestation(state, attester_slashing.attestation_1)
148  
149      yield from run_attester_slashing_processing(state, attester_slashing, False)