Documentation ¶
Overview ¶
Package attestationutil contains useful helpers for converting attestations into indexed form.
Index ¶
- func AttestingIndices(bf bitfield.Bitfield, committee []uint64) []uint64
- func ConvertToIndexed(ctx context.Context, attestation *ethpb.Attestation, committee []uint64) *ethpb.IndexedAttestation
- func IsValidAttestationIndices(ctx context.Context, indexedAttestation *ethpb.IndexedAttestation) error
- func VerifyIndexedAttestationSig(ctx context.Context, indexedAtt *ethpb.IndexedAttestation, ...) error
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AttestingIndices ¶
AttestingIndices returns the attesting participants indices from the attestation data. The committee is provided as an argument rather than a direct implementation from the spec definition. Having the committee as an argument allows for re-use of beacon committees when possible.
Spec pseudocode definition:
def get_attesting_indices(state: BeaconState, data: AttestationData, bits: Bitlist[MAX_VALIDATORS_PER_COMMITTEE]) -> Set[ValidatorIndex]: """ Return the set of attesting indices corresponding to ``data`` and ``bits``. """ committee = get_beacon_committee(state, data.slot, data.index) return set(index for i, index in enumerate(committee) if bits[i])
func ConvertToIndexed ¶
func ConvertToIndexed(ctx context.Context, attestation *ethpb.Attestation, committee []uint64) *ethpb.IndexedAttestation
ConvertToIndexed converts attestation to (almost) indexed-verifiable form.
Note about spec pseudocode definition. The state was used by get_attesting_indices to determine the attestation committee. Now that we provide this as an argument, we no longer need to provide a state.
Spec pseudocode definition:
def get_indexed_attestation(state: BeaconState, attestation: Attestation) -> IndexedAttestation: """ Return the indexed attestation corresponding to ``attestation``. """ attesting_indices = get_attesting_indices(state, attestation.data, attestation.aggregation_bits) return IndexedAttestation( attesting_indices=sorted(attesting_indices), data=attestation.data, signature=attestation.signature, )
func IsValidAttestationIndices ¶
func IsValidAttestationIndices(ctx context.Context, indexedAttestation *ethpb.IndexedAttestation) error
IsValidAttestationIndices this helper function performs the first part of the spec indexed attestation validation starting at Check if “indexed_attestation“ comment and ends at Verify aggregate signature comment.
Spec pseudocode definition:
def is_valid_indexed_attestation(state: BeaconState, indexed_attestation: IndexedAttestation) -> bool: """ Check if ``indexed_attestation`` has valid indices and signature. """ indices = indexed_attestation.attesting_indices # Verify max number of indices if not len(indices) <= MAX_VALIDATORS_PER_COMMITTEE: return False # Verify indices are sorted and unique if not indices == sorted(set(indices)): # Verify aggregate signature if not bls_verify( pubkey=bls_aggregate_pubkeys([state.validators[i].pubkey for i in indices]), message_hash=hash_tree_root(indexed_attestation.data), signature=indexed_attestation.signature, domain=get_domain(state, DOMAIN_BEACON_ATTESTER, indexed_attestation.data.target.epoch), ): return False return True
func VerifyIndexedAttestationSig ¶
func VerifyIndexedAttestationSig(ctx context.Context, indexedAtt *ethpb.IndexedAttestation, pubKeys []*bls.PublicKey, domain []byte) error
VerifyIndexedAttestationSig this helper function performs the last part of the spec indexed attestation validation starting at Verify aggregate signature comment.
Spec pseudocode definition:
def is_valid_indexed_attestation(state: BeaconState, indexed_attestation: IndexedAttestation) -> bool: """ Check if ``indexed_attestation`` has sorted and unique indices and a valid aggregate signature. """ # Verify indices are sorted and unique indices = indexed_attestation.attesting_indices if not indices == sorted(set(indices)): return False # Verify aggregate signature pubkeys = [state.validators[i].pubkey for i in indices] domain = get_domain(state, DOMAIN_BEACON_ATTESTER, indexed_attestation.data.target.epoch) signing_root = compute_signing_root(indexed_attestation.data, domain) return bls.FastAggregateVerify(pubkeys, signing_root, indexed_attestation.signature)
Types ¶
This section is empty.