attestationutil

package
v1.0.0-alpha.6.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 1, 2020 License: GPL-3.0 Imports: 11 Imported by: 0

Documentation

Overview

Package attestationutil contains useful helpers for converting attestations into indexed form.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AttestingIndices

func AttestingIndices(bf bitfield.Bitfield, committee []uint64) []uint64

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL