Skip to content

Commit 8a7d033

Browse files
committed
Add eth.beacon.helpers.is_surround_vote and implement tests
1 parent e4b8e98 commit 8a7d033

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

eth/beacon/helpers.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,3 +430,21 @@ def is_double_vote(attestation_data_1: 'AttestationData',
430430
due to a 'double vote'.
431431
"""
432432
return attestation_data_1.slot == attestation_data_2.slot
433+
434+
435+
def is_surround_vote(attestation_data_1: 'AttestationData',
436+
attestation_data_2: 'AttestationData') -> bool:
437+
"""
438+
Assumes ``attestation_data_1`` is distinct from ``attestation_data_2``.
439+
440+
Returns True if the provided ``AttestationData`` are slashable
441+
due to a 'surround vote'.
442+
443+
Note: parameter order matters as this function only checks
444+
that ``attestation_data_1`` surrounds ``attestation_data_2``.
445+
"""
446+
return (
447+
(attestation_data_1.justified_slot < attestation_data_2.justified_slot) and
448+
(attestation_data_2.justified_slot + 1 == attestation_data_2.slot) and
449+
(attestation_data_2.slot < attestation_data_1.slot)
450+
)

tests/beacon/test_helpers.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
_get_shard_committees_at_slot,
3737
get_block_committees_info,
3838
is_double_vote,
39+
is_surround_vote,
3940
)
4041

4142

@@ -757,3 +758,22 @@ def test_is_double_vote(sample_attestation_data_params):
757758
attestation_data_3 = AttestationData(**attestation_data_3_params)
758759

759760
assert not is_double_vote(attestation_data_1, attestation_data_3)
761+
762+
763+
def test_is_surround_vote(sample_attestation_data_params):
764+
attestation_data_1_params = {
765+
**sample_attestation_data_params,
766+
'slot': 4,
767+
'justified_slot': 0,
768+
769+
}
770+
attestation_data_1 = AttestationData(**attestation_data_1_params)
771+
772+
attestation_data_2_params = {
773+
**sample_attestation_data_params,
774+
'slot': 3,
775+
'justified_slot': 2,
776+
}
777+
attestation_data_2 = AttestationData(**attestation_data_2_params)
778+
779+
assert is_surround_vote(attestation_data_1, attestation_data_2)

0 commit comments

Comments
 (0)