Skip to content

Commit e4b8e98

Browse files
committed
Add eth.beacon.helpers.is_double_vote and implement tests
1 parent d00ab3b commit e4b8e98

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

eth/beacon/helpers.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
if TYPE_CHECKING:
4343
from eth.beacon.enums import SignatureDomain # noqa: F401
4444
from eth.beacon.types.attestation_records import AttestationRecord # noqa: F401
45+
from eth.beacon.types.attestation_data import AttestationData # noqa: F401
4546
from eth.beacon.types.blocks import BaseBeaconBlock # noqa: F401
4647
from eth.beacon.types.states import BeaconState # noqa: F401
4748
from eth.beacon.types.fork_data import ForkData # noqa: F401
@@ -418,3 +419,14 @@ def get_domain(fork_data: 'ForkData',
418419
fork_data,
419420
slot,
420421
) * 4294967296 + domain_type
422+
423+
424+
def is_double_vote(attestation_data_1: 'AttestationData',
425+
attestation_data_2: 'AttestationData') -> bool:
426+
"""
427+
Assumes ``attestation_data_1`` is distinct from ``attestation_data_2``.
428+
429+
Returns True if the provided ``AttestationData`` are slashable
430+
due to a 'double vote'.
431+
"""
432+
return attestation_data_1.slot == attestation_data_2.slot

tests/beacon/test_helpers.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
from eth.beacon.enums import (
1414
ValidatorStatusCode,
1515
)
16+
from eth.beacon.types.attestation_data import (
17+
AttestationData,
18+
)
1619
from eth.beacon.types.blocks import BaseBeaconBlock
1720
from eth.beacon.types.fork_data import ForkData
1821
from eth.beacon.types.shard_committees import ShardCommittee
@@ -32,6 +35,7 @@
3235
get_new_validator_registry_delta_chain_tip,
3336
_get_shard_committees_at_slot,
3437
get_block_committees_info,
38+
is_double_vote,
3539
)
3640

3741

@@ -729,3 +733,27 @@ def test_get_domain(pre_fork_version,
729733
slot=current_slot,
730734
domain_type=domain_type,
731735
)
736+
737+
738+
def test_is_double_vote(sample_attestation_data_params):
739+
attestation_data_1_params = {
740+
**sample_attestation_data_params,
741+
'slot': 12345,
742+
}
743+
attestation_data_1 = AttestationData(**attestation_data_1_params)
744+
745+
attestation_data_2_params = {
746+
**sample_attestation_data_params,
747+
'slot': 12345,
748+
}
749+
attestation_data_2 = AttestationData(**attestation_data_2_params)
750+
751+
assert is_double_vote(attestation_data_1, attestation_data_2)
752+
753+
attestation_data_3_params = {
754+
**sample_attestation_data_params,
755+
'slot': 54321,
756+
}
757+
attestation_data_3 = AttestationData(**attestation_data_3_params)
758+
759+
assert not is_double_vote(attestation_data_1, attestation_data_3)

0 commit comments

Comments
 (0)