remove custody_bitfield from indexedattestation. add two separate arrays for 0 and 1 bit

This commit is contained in:
Danny Ryan 2019-03-28 11:26:04 -06:00
parent fbb09795ed
commit 1f657cfec5
No known key found for this signature in database
GPG Key ID: 2765A792E42CE07A
1 changed files with 16 additions and 29 deletions

View File

@ -377,11 +377,10 @@ The types are defined topologically to aid in facilitating an executable version
```python ```python
{ {
# Validator indices # Validator indices
'validator_indices': ['uint64'], 'custody_bit_0_indices': ['uint64'],
'custody_bit_1_indices': ['uint64'],
# Attestation data # Attestation data
'data': AttestationData, 'data': AttestationData,
# Custody bitfield
'custody_bitfield': 'bytes',
# Aggregate signature # Aggregate signature
'aggregate_signature': 'bytes96', 'aggregate_signature': 'bytes96',
} }
@ -1060,7 +1059,7 @@ def get_attestation_participants(state: BeaconState,
attestation_data: AttestationData, attestation_data: AttestationData,
bitfield: bytes) -> List[ValidatorIndex]: bitfield: bytes) -> List[ValidatorIndex]:
""" """
Return the participant indices corresponding to ``attestation_data`` and ``bitfield``. Return the sorted participant indices corresponding to ``attestation_data`` and ``bitfield``.
""" """
crosslink_committee = get_crosslink_committee_for_attestation(state, attestation_data) crosslink_committee = get_crosslink_committee_for_attestation(state, attestation_data)
@ -1072,7 +1071,7 @@ def get_attestation_participants(state: BeaconState,
aggregation_bit = get_bitfield_bit(bitfield, i) aggregation_bit = get_bitfield_bit(bitfield, i)
if aggregation_bit == 0b1: if aggregation_bit == 0b1:
participants.append(validator_index) participants.append(validator_index)
return participants return sorted(participants)
``` ```
### `int_to_bytes1`, `int_to_bytes2`, ... ### `int_to_bytes1`, `int_to_bytes2`, ...
@ -1184,20 +1183,13 @@ def convert_to_indexed(state: BeaconState, attestation: Attestation):
Convert an attestation to (almost) indexed-verifiable form Convert an attestation to (almost) indexed-verifiable form
""" """
attesting_indices = get_attestation_participants(state, attestation.data, attestation.aggregation_bitfield) attesting_indices = get_attestation_participants(state, attestation.data, attestation.aggregation_bitfield)
# reconstruct custody bitfield for the truncated attesting_indices
custody_bit_1_indices = get_attestation_participants(state, attestation.data, attestation.custody_bitfield) custody_bit_1_indices = get_attestation_participants(state, attestation.data, attestation.custody_bitfield)
custody_bitfield = b'\x00' * ((len(attesting_indices) + 7) // 8) custody_bit_0_indices = [index for index in attesting_indices if index not in custody_bit_1_indices]
crosslink_committee = get_crosslink_committee_for_attestation(state, attestation.data)
for i, validator_index in enumerate(crosslink_committee):
if get_bitfield_bit(attestation.custody_bitfield, i):
custody_bitfield = set_bitfield_bit(custody_bitfield, attesting_indices.index(validator_index))
return IndexedAttestation( return IndexedAttestation(
validator_indices=attesting_indices, custody_bit_0_indices=custody_bit_0_indices,
custody_bit_1_indices=custody_bit_1_indices,
data=attestation.data, data=attestation.data,
custody_bitfield=custody_bitfield,
aggregate_signature=attestation.aggregate_signature aggregate_signature=attestation.aggregate_signature
) )
``` ```
@ -1209,22 +1201,21 @@ def verify_indexed_attestation(state: BeaconState, indexed_attestation: IndexedA
""" """
Verify validity of ``indexed_attestation`` fields. Verify validity of ``indexed_attestation`` fields.
""" """
if indexed_attestation.custody_bitfield != b'\x00' * len(indexed_attestation.custody_bitfield): # [TO BE REMOVED IN PHASE 1] custody_bit_0_indices = indexed_attestation.custody_bit_0_indices
custody_bit_1_indices = indexed_attestation.custody_bit_1_indices
if len(custody_bit_1_indices) > 0: # [TO BE REMOVED IN PHASE 1]
return False return False
if not (1 <= len(indexed_attestation.validator_indices) <= MAX_ATTESTATION_PARTICIPANTS): total_attesting_indices = len(custody_bit_0_indices + custody_bit_1_indices)
if not (1 <= total_attesting_indices <= MAX_ATTESTATION_PARTICIPANTS):
return False return False
if not verify_bitfield(indexed_attestation.custody_bitfield, len(indexed_attestation.validator_indices)): if custody_bit_0_indices != sorted(custody_bit_0_indices):
return False return False
custody_bit_0_indices = [] if custody_bit_1_indices != sorted(custody_bit_1_indices):
custody_bit_1_indices = [] return False
for i, validator_index in enumerate(indexed_attestation.validator_indices):
if get_bitfield_bit(indexed_attestation.custody_bitfield, i) == 0b0:
custody_bit_0_indices.append(validator_index)
else:
custody_bit_1_indices.append(validator_index)
return bls_verify_multiple( return bls_verify_multiple(
pubkeys=[ pubkeys=[
@ -2355,10 +2346,6 @@ def process_attester_slashing(state: BeaconState,
is_surround_vote(attestation1.data, attestation2.data) is_surround_vote(attestation1.data, attestation2.data)
) )
# check that indices are sorted
assert attestation1.validator_indices == sorted(attestation1.validator_indices)
assert attestation2.validator_indices == sorted(attestation2.validator_indices)
assert verify_indexed_attestation(state, attestation1) assert verify_indexed_attestation(state, attestation1)
assert verify_indexed_attestation(state, attestation2) assert verify_indexed_attestation(state, attestation2)
slashable_indices = [ slashable_indices = [