def validate_is_slashable_attestation_data( attestation_1: IndexedAttestation, attestation_2: IndexedAttestation) -> None: is_slashable_data = is_slashable_attestation_data(attestation_1.data, attestation_2.data) if not is_slashable_data: raise ValidationError( "The `AttesterSlashing` object doesn't meet the Casper FFG slashing conditions." )
def test_is_slashable_attestation_data(sample_attestation_data_params, is_double_vote, is_surround_vote): data_1 = AttestationData(**sample_attestation_data_params) data_2 = AttestationData(**sample_attestation_data_params) if is_double_vote: data_2 = data_2.copy(beacon_block_root=( int.from_bytes(data_1.beacon_block_root, "little") + 1).to_bytes(32, "little")) if is_surround_vote: data_1 = data_1.copy( source=data_1.source.copy(epoch=data_2.source.epoch - 1), target=data_1.target.copy(epoch=data_2.target.epoch + 1), ) assert is_slashable_attestation_data(data_1, data_2) == (is_double_vote or is_surround_vote)
def test_is_slashable_attestation_data(sample_attestation_data_params, is_double_vote, is_surround_vote): data_1 = AttestationData.create(**sample_attestation_data_params) data_2 = AttestationData.create(**sample_attestation_data_params) if is_double_vote: data_2 = data_2.set( "beacon_block_root", (int.from_bytes(data_1.beacon_block_root, "little") + 1).to_bytes( 32, "little"), ) if is_surround_vote: data_1 = data_1.transform( ("source", "epoch"), data_2.source.epoch - 1).transform( ("target", "epoch"), data_2.target.epoch + 1) assert is_slashable_attestation_data(data_1, data_2) == (is_double_vote or is_surround_vote)