mirror of
https://github.com/status-im/eth2.0-specs.git
synced 2025-02-26 01:05:15 +00:00
pass on checkpoints working in testing
This commit is contained in:
parent
de5b9cc823
commit
8a732fbbcf
@ -1344,28 +1344,28 @@ def process_justification_and_finalization(state: BeaconState) -> None:
|
|||||||
state, get_matching_target_attestations(state, previous_epoch)
|
state, get_matching_target_attestations(state, previous_epoch)
|
||||||
)
|
)
|
||||||
if previous_epoch_matching_target_balance * 3 >= get_total_active_balance(state) * 2:
|
if previous_epoch_matching_target_balance * 3 >= get_total_active_balance(state) * 2:
|
||||||
state.current_justified_checkpoint = Checkpoint(previous_epoch, get_block_root(state, previous_epoch))
|
state.current_justified_checkpoint = Checkpoint(epoch=previous_epoch, root=get_block_root(state, previous_epoch))
|
||||||
state.justification_bitfield |= (1 << 1)
|
state.justification_bitfield |= (1 << 1)
|
||||||
current_epoch_matching_target_balance = get_attesting_balance(
|
current_epoch_matching_target_balance = get_attesting_balance(
|
||||||
state, get_matching_target_attestations(state, current_epoch)
|
state, get_matching_target_attestations(state, current_epoch)
|
||||||
)
|
)
|
||||||
if current_epoch_matching_target_balance * 3 >= get_total_active_balance(state) * 2:
|
if current_epoch_matching_target_balance * 3 >= get_total_active_balance(state) * 2:
|
||||||
state.current_justified_checkpoint = Checkpoint(current_epoch, get_block_root(state, current_epoch))
|
state.current_justified_checkpoint = Checkpoint(epoch=current_epoch, root=get_block_root(state, current_epoch))
|
||||||
state.justification_bitfield |= (1 << 0)
|
state.justification_bitfield |= (1 << 0)
|
||||||
|
|
||||||
# Process finalizations
|
# Process finalizations
|
||||||
bitfield = state.justification_bitfield
|
bitfield = state.justification_bitfield
|
||||||
# The 2nd/3rd/4th most recent epochs are justified, the 2nd using the 4th as source
|
# The 2nd/3rd/4th most recent epochs are justified, the 2nd using the 4th as source
|
||||||
if (bitfield >> 1) % 8 == 0b111 and old_previous_justified_epoch + 3 == current_epoch:
|
if (bitfield >> 1) % 8 == 0b111 and old_previous_justified_checkpoint.epoch + 3 == current_epoch:
|
||||||
state.finalized_checkpoint = old_previous_justified_checkpoint
|
state.finalized_checkpoint = old_previous_justified_checkpoint
|
||||||
# The 2nd/3rd most recent epochs are justified, the 2nd using the 3rd as source
|
# The 2nd/3rd most recent epochs are justified, the 2nd using the 3rd as source
|
||||||
if (bitfield >> 1) % 4 == 0b11 and old_previous_justified_epoch + 2 == current_epoch:
|
if (bitfield >> 1) % 4 == 0b11 and old_previous_justified_checkpoint.epoch+ 2 == current_epoch:
|
||||||
state.finalized_checkpoint = old_previous_justified_checkpoint
|
state.finalized_checkpoint = old_previous_justified_checkpoint
|
||||||
# The 1st/2nd/3rd most recent epochs are justified, the 1st using the 3rd as source
|
# The 1st/2nd/3rd most recent epochs are justified, the 1st using the 3rd as source
|
||||||
if (bitfield >> 0) % 8 == 0b111 and old_current_justified_epoch + 2 == current_epoch:
|
if (bitfield >> 0) % 8 == 0b111 and old_current_justified_checkpoint.epoch + 2 == current_epoch:
|
||||||
state.finalized_checkpoint = old_current_justified_checkpoint
|
state.finalized_checkpoint = old_current_justified_checkpoint
|
||||||
# The 1st/2nd most recent epochs are justified, the 1st using the 2nd as source
|
# The 1st/2nd most recent epochs are justified, the 1st using the 2nd as source
|
||||||
if (bitfield >> 0) % 4 == 0b11 and old_current_justified_epoch + 1 == current_epoch:
|
if (bitfield >> 0) % 4 == 0b11 and old_current_justified_checkpoint.epoch + 1 == current_epoch:
|
||||||
state.finalized_checkpoint = old_current_justified_checkpoint
|
state.finalized_checkpoint = old_current_justified_checkpoint
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -24,11 +24,11 @@ def build_attestation_data(spec, state, slot, shard):
|
|||||||
epoch_boundary_root = spec.get_block_root(state, spec.get_current_epoch(state))
|
epoch_boundary_root = spec.get_block_root(state, spec.get_current_epoch(state))
|
||||||
|
|
||||||
if slot < current_epoch_start_slot:
|
if slot < current_epoch_start_slot:
|
||||||
justified_epoch = state.previous_justified_epoch
|
source_epoch = state.previous_justified_checkpoint.epoch
|
||||||
justified_block_root = state.previous_justified_root
|
source_root = state.previous_justified_checkpoint.root
|
||||||
else:
|
else:
|
||||||
justified_epoch = state.current_justified_epoch
|
source_epoch = state.current_justified_checkpoint.epoch
|
||||||
justified_block_root = state.current_justified_root
|
source_root = state.current_justified_checkpoint.root
|
||||||
|
|
||||||
if spec.slot_to_epoch(slot) == spec.get_current_epoch(state):
|
if spec.slot_to_epoch(slot) == spec.get_current_epoch(state):
|
||||||
parent_crosslink = state.current_crosslinks[shard]
|
parent_crosslink = state.current_crosslinks[shard]
|
||||||
@ -37,10 +37,8 @@ def build_attestation_data(spec, state, slot, shard):
|
|||||||
|
|
||||||
return spec.AttestationData(
|
return spec.AttestationData(
|
||||||
beacon_block_root=block_root,
|
beacon_block_root=block_root,
|
||||||
source_epoch=justified_epoch,
|
source_checkpoint=spec.Checkpoint(epoch=source_epoch, root=source_root),
|
||||||
source_root=justified_block_root,
|
target_checkpoint=spec.Checkpoint(epoch=spec.slot_to_epoch(slot), root=epoch_boundary_root),
|
||||||
target_epoch=spec.slot_to_epoch(slot),
|
|
||||||
target_root=epoch_boundary_root,
|
|
||||||
crosslink=spec.Crosslink(
|
crosslink=spec.Crosslink(
|
||||||
shard=shard,
|
shard=shard,
|
||||||
start_epoch=parent_crosslink.end_epoch,
|
start_epoch=parent_crosslink.end_epoch,
|
||||||
@ -64,8 +62,8 @@ def get_valid_attestation(spec, state, slot=None, signed=False):
|
|||||||
|
|
||||||
crosslink_committee = spec.get_crosslink_committee(
|
crosslink_committee = spec.get_crosslink_committee(
|
||||||
state,
|
state,
|
||||||
attestation_data.target_epoch,
|
attestation_data.target_checkpoint.epoch,
|
||||||
attestation_data.crosslink.shard
|
attestation_data.crosslink.shard,
|
||||||
)
|
)
|
||||||
|
|
||||||
committee_size = len(crosslink_committee)
|
committee_size = len(crosslink_committee)
|
||||||
@ -126,7 +124,7 @@ def get_attestation_signature(spec, state, attestation_data, privkey, custody_bi
|
|||||||
domain=spec.get_domain(
|
domain=spec.get_domain(
|
||||||
state=state,
|
state=state,
|
||||||
domain_type=spec.DOMAIN_ATTESTATION,
|
domain_type=spec.DOMAIN_ATTESTATION,
|
||||||
message_epoch=attestation_data.target_epoch,
|
message_epoch=attestation_data.target_checkpoint.epoch,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -134,7 +132,7 @@ def get_attestation_signature(spec, state, attestation_data, privkey, custody_bi
|
|||||||
def fill_aggregate_attestation(spec, state, attestation):
|
def fill_aggregate_attestation(spec, state, attestation):
|
||||||
crosslink_committee = spec.get_crosslink_committee(
|
crosslink_committee = spec.get_crosslink_committee(
|
||||||
state,
|
state,
|
||||||
attestation.data.target_epoch,
|
attestation.data.target_checkpoint.epoch,
|
||||||
attestation.data.crosslink.shard,
|
attestation.data.crosslink.shard,
|
||||||
)
|
)
|
||||||
for i in range(len(crosslink_committee)):
|
for i in range(len(crosslink_committee)):
|
||||||
|
@ -7,7 +7,7 @@ def get_valid_attester_slashing(spec, state, signed_1=False, signed_2=False):
|
|||||||
attestation_1 = get_valid_attestation(spec, state, signed=signed_1)
|
attestation_1 = get_valid_attestation(spec, state, signed=signed_1)
|
||||||
|
|
||||||
attestation_2 = deepcopy(attestation_1)
|
attestation_2 = deepcopy(attestation_1)
|
||||||
attestation_2.data.target_root = b'\x01' * 32
|
attestation_2.data.target_checkpoint.root = b'\x01' * 32
|
||||||
|
|
||||||
if signed_2:
|
if signed_2:
|
||||||
sign_attestation(spec, state, attestation_2)
|
sign_attestation(spec, state, attestation_2)
|
||||||
|
@ -38,7 +38,7 @@ def run_attestation_processing(spec, state, attestation, valid=True):
|
|||||||
spec.process_attestation(state, attestation)
|
spec.process_attestation(state, attestation)
|
||||||
|
|
||||||
# Make sure the attestation has been processed
|
# Make sure the attestation has been processed
|
||||||
if attestation.data.target_epoch == spec.get_current_epoch(state):
|
if attestation.data.target_checkpoint.epoch == spec.get_current_epoch(state):
|
||||||
assert len(state.current_epoch_attestations) == current_epoch_count + 1
|
assert len(state.current_epoch_attestations) == current_epoch_count + 1
|
||||||
else:
|
else:
|
||||||
assert len(state.previous_epoch_attestations) == previous_epoch_count + 1
|
assert len(state.previous_epoch_attestations) == previous_epoch_count + 1
|
||||||
@ -119,16 +119,16 @@ def test_after_epoch_slots(spec, state):
|
|||||||
@spec_state_test
|
@spec_state_test
|
||||||
def test_old_source_epoch(spec, state):
|
def test_old_source_epoch(spec, state):
|
||||||
state.slot = spec.SLOTS_PER_EPOCH * 5
|
state.slot = spec.SLOTS_PER_EPOCH * 5
|
||||||
state.finalized_epoch = 2
|
state.finalized_checkpoint.epoch = 2
|
||||||
state.previous_justified_epoch = 3
|
state.previous_justified_checkpoint.epoch = 3
|
||||||
state.current_justified_epoch = 4
|
state.current_justified_checkpoint.epoch = 4
|
||||||
attestation = get_valid_attestation(spec, state, slot=(spec.SLOTS_PER_EPOCH * 3) + 1)
|
attestation = get_valid_attestation(spec, state, slot=(spec.SLOTS_PER_EPOCH * 3) + 1)
|
||||||
|
|
||||||
# test logic sanity check: make sure the attestation is pointing to oldest known source epoch
|
# test logic sanity check: make sure the attestation is pointing to oldest known source epoch
|
||||||
assert attestation.data.source_epoch == state.previous_justified_epoch
|
assert attestation.data.source_checkpoint.epoch == state.previous_justified_checkpoint.epoch
|
||||||
|
|
||||||
# Now go beyond that, it will be invalid
|
# Now go beyond that, it will be invalid
|
||||||
attestation.data.source_epoch -= 1
|
attestation.data.source_checkpoint.epoch -= 1
|
||||||
|
|
||||||
sign_attestation(spec, state, attestation)
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ def test_new_source_epoch(spec, state):
|
|||||||
attestation = get_valid_attestation(spec, state)
|
attestation = get_valid_attestation(spec, state)
|
||||||
state.slot += spec.MIN_ATTESTATION_INCLUSION_DELAY
|
state.slot += spec.MIN_ATTESTATION_INCLUSION_DELAY
|
||||||
|
|
||||||
attestation.data.source_epoch += 1
|
attestation.data.source_checkpoint.epoch += 1
|
||||||
|
|
||||||
sign_attestation(spec, state, attestation)
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ def test_source_root_is_target_root(spec, state):
|
|||||||
attestation = get_valid_attestation(spec, state)
|
attestation = get_valid_attestation(spec, state)
|
||||||
state.slot += spec.MIN_ATTESTATION_INCLUSION_DELAY
|
state.slot += spec.MIN_ATTESTATION_INCLUSION_DELAY
|
||||||
|
|
||||||
attestation.data.source_root = attestation.data.target_root
|
attestation.data.source_checkpoint.root = attestation.data.target_checkpoint.root
|
||||||
|
|
||||||
sign_attestation(spec, state, attestation)
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
@ -180,21 +180,18 @@ def test_invalid_current_source_root(spec, state):
|
|||||||
state.slot = spec.SLOTS_PER_EPOCH * 5
|
state.slot = spec.SLOTS_PER_EPOCH * 5
|
||||||
state.finalized_epoch = 2
|
state.finalized_epoch = 2
|
||||||
|
|
||||||
state.previous_justified_epoch = 3
|
state.previous_justified_checkpoint = spec.Checkpoint(epoch=3, root=b'\x01'*32)
|
||||||
state.previous_justified_root = b'\x01' * 32
|
state.current_justified_checkpoint = spec.Checkpoint(epoch=4, root=b'\x32'*32)
|
||||||
|
|
||||||
state.current_justified_epoch = 4
|
|
||||||
state.current_justified_root = b'\xff' * 32
|
|
||||||
|
|
||||||
attestation = get_valid_attestation(spec, state, slot=(spec.SLOTS_PER_EPOCH * 3) + 1)
|
attestation = get_valid_attestation(spec, state, slot=(spec.SLOTS_PER_EPOCH * 3) + 1)
|
||||||
state.slot += spec.MIN_ATTESTATION_INCLUSION_DELAY
|
state.slot += spec.MIN_ATTESTATION_INCLUSION_DELAY
|
||||||
|
|
||||||
# Test logic sanity checks:
|
# Test logic sanity checks:
|
||||||
assert state.current_justified_root != state.previous_justified_root
|
assert state.current_justified_checkpoint.root != state.previous_justified_checkpoint.root
|
||||||
assert attestation.data.source_root == state.previous_justified_root
|
assert attestation.data.source_checkpoint.root == state.previous_justified_checkpoint.root
|
||||||
|
|
||||||
# Make attestation source root invalid: should be previous justified, not current one
|
# Make attestation source root invalid: should be previous justified, not current one
|
||||||
attestation.data.source_root = state.current_justified_root
|
attestation.data.source_checkpoint.root = state.current_justified_checkpoint.root
|
||||||
|
|
||||||
sign_attestation(spec, state, attestation)
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
@ -207,7 +204,7 @@ def test_bad_source_root(spec, state):
|
|||||||
attestation = get_valid_attestation(spec, state)
|
attestation = get_valid_attestation(spec, state)
|
||||||
state.slot += spec.MIN_ATTESTATION_INCLUSION_DELAY
|
state.slot += spec.MIN_ATTESTATION_INCLUSION_DELAY
|
||||||
|
|
||||||
attestation.data.source_root = b'\x42' * 32
|
attestation.data.source_checkpoint.root = b'\x42' * 32
|
||||||
|
|
||||||
sign_attestation(spec, state, attestation)
|
sign_attestation(spec, state, attestation)
|
||||||
|
|
||||||
|
@ -68,12 +68,14 @@ def test_success_surround(spec, state):
|
|||||||
next_epoch(spec, state)
|
next_epoch(spec, state)
|
||||||
apply_empty_block(spec, state)
|
apply_empty_block(spec, state)
|
||||||
|
|
||||||
state.current_justified_epoch += 1
|
state.current_justified_checkpoint.epoch += 1
|
||||||
attester_slashing = get_valid_attester_slashing(spec, state, signed_1=False, signed_2=True)
|
attester_slashing = get_valid_attester_slashing(spec, state, signed_1=False, signed_2=True)
|
||||||
|
attestation_1 = attester_slashing.attestation_1
|
||||||
|
attestation_2 = attester_slashing.attestation_2
|
||||||
|
|
||||||
# set attestion1 to surround attestation 2
|
# set attestion1 to surround attestation 2
|
||||||
attester_slashing.attestation_1.data.source_epoch = attester_slashing.attestation_2.data.source_epoch - 1
|
attestation_1.data.source_checkpoint.epoch = attestation_2.data.source_checkpoint.epoch - 1
|
||||||
attester_slashing.attestation_1.data.target_epoch = attester_slashing.attestation_2.data.target_epoch + 1
|
attestation_1.data.target_checkpoint.epoch = attestation_2.data.target_checkpoint.epoch + 1
|
||||||
|
|
||||||
sign_indexed_attestation(spec, state, attester_slashing.attestation_1)
|
sign_indexed_attestation(spec, state, attester_slashing.attestation_1)
|
||||||
|
|
||||||
@ -120,7 +122,7 @@ def test_same_data(spec, state):
|
|||||||
def test_no_double_or_surround(spec, state):
|
def test_no_double_or_surround(spec, state):
|
||||||
attester_slashing = get_valid_attester_slashing(spec, state, signed_1=False, signed_2=True)
|
attester_slashing = get_valid_attester_slashing(spec, state, signed_1=False, signed_2=True)
|
||||||
|
|
||||||
attester_slashing.attestation_1.data.target_epoch += 1
|
attester_slashing.attestation_1.data.target_checkpoint.epoch += 1
|
||||||
sign_indexed_attestation(spec, state, attester_slashing.attestation_1)
|
sign_indexed_attestation(spec, state, attester_slashing.attestation_1)
|
||||||
|
|
||||||
yield from run_attester_slashing_processing(spec, state, attester_slashing, False)
|
yield from run_attester_slashing_processing(spec, state, attester_slashing, False)
|
||||||
|
@ -96,7 +96,7 @@ def test_single_crosslink_update_from_previous_epoch(spec, state):
|
|||||||
# ensure rewarded
|
# ensure rewarded
|
||||||
for index in spec.get_crosslink_committee(
|
for index in spec.get_crosslink_committee(
|
||||||
state,
|
state,
|
||||||
attestation.data.target_epoch,
|
attestation.data.target_checkpoint.epoch,
|
||||||
attestation.data.crosslink.shard):
|
attestation.data.crosslink.shard):
|
||||||
assert crosslink_deltas[0][index] > 0
|
assert crosslink_deltas[0][index] > 0
|
||||||
assert crosslink_deltas[1][index] == 0
|
assert crosslink_deltas[1][index] == 0
|
||||||
@ -148,7 +148,7 @@ def test_double_late_crosslink(spec, state):
|
|||||||
# ensure no reward, only penalties for the failed crosslink
|
# ensure no reward, only penalties for the failed crosslink
|
||||||
for index in spec.get_crosslink_committee(
|
for index in spec.get_crosslink_committee(
|
||||||
state,
|
state,
|
||||||
attestation_2.data.target_epoch,
|
attestation_2.data.target_checkpoint.epoch,
|
||||||
attestation_2.data.crosslink.shard):
|
attestation_2.data.crosslink.shard):
|
||||||
assert crosslink_deltas[0][index] == 0
|
assert crosslink_deltas[0][index] == 0
|
||||||
assert crosslink_deltas[1][index] > 0
|
assert crosslink_deltas[1][index] > 0
|
||||||
|
@ -14,25 +14,22 @@ def check_finality(spec,
|
|||||||
previous_justified_changed,
|
previous_justified_changed,
|
||||||
finalized_changed):
|
finalized_changed):
|
||||||
if current_justified_changed:
|
if current_justified_changed:
|
||||||
assert state.current_justified_epoch > prev_state.current_justified_epoch
|
assert state.current_justified_checkpoint.epoch > prev_state.current_justified_checkpoint.epoch
|
||||||
assert state.current_justified_root != prev_state.current_justified_root
|
assert state.current_justified_checkpoint.root != prev_state.current_justified_checkpoint.root
|
||||||
else:
|
else:
|
||||||
assert state.current_justified_epoch == prev_state.current_justified_epoch
|
assert state.current_justified_checkpoint == prev_state.current_justified_checkpoint
|
||||||
assert state.current_justified_root == prev_state.current_justified_root
|
|
||||||
|
|
||||||
if previous_justified_changed:
|
if previous_justified_changed:
|
||||||
assert state.previous_justified_epoch > prev_state.previous_justified_epoch
|
assert state.previous_justified_checkpoint.epoch > prev_state.previous_justified_checkpoint.epoch
|
||||||
assert state.previous_justified_root != prev_state.previous_justified_root
|
assert state.previous_justified_checkpoint.root != prev_state.previous_justified_checkpoint.root
|
||||||
else:
|
else:
|
||||||
assert state.previous_justified_epoch == prev_state.previous_justified_epoch
|
assert state.previous_justified_checkpoint == prev_state.previous_justified_checkpoint
|
||||||
assert state.previous_justified_root == prev_state.previous_justified_root
|
|
||||||
|
|
||||||
if finalized_changed:
|
if finalized_changed:
|
||||||
assert state.finalized_epoch > prev_state.finalized_epoch
|
assert state.finalized_checkpoint.epoch > prev_state.finalized_checkpoint.epoch
|
||||||
assert state.finalized_root != prev_state.finalized_root
|
assert state.finalized_checkpoint.root != prev_state.finalized_checkpoint.root
|
||||||
else:
|
else:
|
||||||
assert state.finalized_epoch == prev_state.finalized_epoch
|
assert state.finalized_checkpoint == prev_state.finalized_checkpoint
|
||||||
assert state.finalized_root == prev_state.finalized_root
|
|
||||||
|
|
||||||
|
|
||||||
def next_epoch_with_attestations(spec,
|
def next_epoch_with_attestations(spec,
|
||||||
@ -82,8 +79,7 @@ def test_finality_rule_4(spec, state):
|
|||||||
elif epoch >= 3:
|
elif epoch >= 3:
|
||||||
# rule 4 of finality
|
# rule 4 of finality
|
||||||
check_finality(spec, state, prev_state, True, True, True)
|
check_finality(spec, state, prev_state, True, True, True)
|
||||||
assert state.finalized_epoch == prev_state.current_justified_epoch
|
assert state.finalized_checkpoint == prev_state.current_justified_checkpoint
|
||||||
assert state.finalized_root == prev_state.current_justified_root
|
|
||||||
|
|
||||||
yield 'blocks', blocks, List[spec.BeaconBlock]
|
yield 'blocks', blocks, List[spec.BeaconBlock]
|
||||||
yield 'post', state
|
yield 'post', state
|
||||||
@ -113,8 +109,7 @@ def test_finality_rule_1(spec, state):
|
|||||||
elif epoch == 2:
|
elif epoch == 2:
|
||||||
# finalized by rule 1
|
# finalized by rule 1
|
||||||
check_finality(spec, state, prev_state, True, True, True)
|
check_finality(spec, state, prev_state, True, True, True)
|
||||||
assert state.finalized_epoch == prev_state.previous_justified_epoch
|
assert state.finalized_checkpoint == prev_state.previous_justified_checkpoint
|
||||||
assert state.finalized_root == prev_state.previous_justified_root
|
|
||||||
|
|
||||||
yield 'blocks', blocks, List[spec.BeaconBlock]
|
yield 'blocks', blocks, List[spec.BeaconBlock]
|
||||||
yield 'post', state
|
yield 'post', state
|
||||||
@ -144,8 +139,7 @@ def test_finality_rule_2(spec, state):
|
|||||||
prev_state, new_blocks, state = next_epoch_with_attestations(spec, state, False, True)
|
prev_state, new_blocks, state = next_epoch_with_attestations(spec, state, False, True)
|
||||||
# finalized by rule 2
|
# finalized by rule 2
|
||||||
check_finality(spec, state, prev_state, True, False, True)
|
check_finality(spec, state, prev_state, True, False, True)
|
||||||
assert state.finalized_epoch == prev_state.previous_justified_epoch
|
assert state.finalized_checkpoint == prev_state.previous_justified_checkpoint
|
||||||
assert state.finalized_root == prev_state.previous_justified_root
|
|
||||||
|
|
||||||
blocks += new_blocks
|
blocks += new_blocks
|
||||||
|
|
||||||
@ -196,8 +190,7 @@ def test_finality_rule_3(spec, state):
|
|||||||
blocks += new_blocks
|
blocks += new_blocks
|
||||||
# rule 3
|
# rule 3
|
||||||
check_finality(spec, state, prev_state, True, True, True)
|
check_finality(spec, state, prev_state, True, True, True)
|
||||||
assert state.finalized_epoch == prev_state.current_justified_epoch
|
assert state.finalized_checkpoint == prev_state.current_justified_checkpoint
|
||||||
assert state.finalized_root == prev_state.current_justified_root
|
|
||||||
|
|
||||||
yield 'blocks', blocks, List[spec.BeaconBlock]
|
yield 'blocks', blocks, List[spec.BeaconBlock]
|
||||||
yield 'post', state
|
yield 'post', state
|
||||||
|
Loading…
x
Reference in New Issue
Block a user