/ test_libs / pyspec / eth2spec / test / block_processing / test_process_block_header.py
test_process_block_header.py
 1  from copy import deepcopy
 2  
 3  from eth2spec.phase0.spec import (
 4      get_beacon_proposer_index,
 5      cache_state,
 6      advance_slot,
 7      process_block_header,
 8  )
 9  from eth2spec.test.context import spec_state_test, expect_assertion_error, always_bls
10  from eth2spec.test.helpers.block import (
11      build_empty_block_for_next_slot,
12      sign_block
13  )
14  from eth2spec.test.helpers.state import next_slot
15  
16  
17  def prepare_state_for_header_processing(state):
18      cache_state(state)
19      advance_slot(state)
20  
21  
22  def run_block_header_processing(state, block, valid=True):
23      """
24      Run ``process_block_header``, yielding:
25        - pre-state ('pre')
26        - block ('block')
27        - post-state ('post').
28      If ``valid == False``, run expecting ``AssertionError``
29      """
30      prepare_state_for_header_processing(state)
31  
32      yield 'pre', state
33      yield 'block', block
34  
35      if not valid:
36          expect_assertion_error(lambda: process_block_header(state, block))
37          yield 'post', None
38          return
39  
40      process_block_header(state, block)
41      yield 'post', state
42  
43  
44  @spec_state_test
45  def test_success_block_header(state):
46      block = build_empty_block_for_next_slot(state, signed=True)
47      yield from run_block_header_processing(state, block)
48  
49  
50  @always_bls
51  @spec_state_test
52  def test_invalid_sig_block_header(state):
53      block = build_empty_block_for_next_slot(state)
54      yield from run_block_header_processing(state, block, valid=False)
55  
56  
57  @spec_state_test
58  def test_invalid_slot_block_header(state):
59      block = build_empty_block_for_next_slot(state)
60      block.slot = state.slot + 2  # invalid slot
61      sign_block(state, block)
62  
63      yield from run_block_header_processing(state, block, valid=False)
64  
65  
66  @spec_state_test
67  def test_invalid_previous_block_root(state):
68      block = build_empty_block_for_next_slot(state)
69      block.previous_block_root = b'\12' * 32  # invalid prev root
70      sign_block(state, block)
71  
72      yield from run_block_header_processing(state, block, valid=False)
73  
74  
75  @spec_state_test
76  def test_proposer_slashed(state):
77      # use stub state to get proposer index of next slot
78      stub_state = deepcopy(state)
79      next_slot(stub_state)
80      proposer_index = get_beacon_proposer_index(stub_state)
81  
82      # set proposer to slashed
83      state.validator_registry[proposer_index].slashed = True
84  
85      block = build_empty_block_for_next_slot(state, signed=True)
86  
87      yield from run_block_header_processing(state, block, valid=False)