mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-24 12:27:18 +00:00
ade61717a4
* first version * cli context * fix service * starting change to ccache * ristretto cache * added test * test on evict * remove evict test * test onevict * comment for exported flag * update all span maps on load * fix setup db * span cache added to help flags * start save cache on exit * save cache to db before close * comment fix * fix flags * setup db new * data update from archive node * gaz * slashing detection on old attestations * un-export * rename * nishant feedback * workspace cr * lint fix * fix calls * start db * fix test * Update slasher/db/db.go Co-Authored-By: Nishant Das <nishdas93@gmail.com> * add flag * fix fail to start beacon client * mock beacon service * fix imports * gaz * goimports * add clear db flag * print finalized epoch * better msg * Update slasher/db/attester_slashings.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * raul feedback * raul feedback * raul feedback * raul feedback * raul feedback * add detection in runtime * fix tests * raul feedbacks * raul feedback * raul feedback * goimports * Update beacon-chain/blockchain/process_attestation_helpers.go * Update beacon-chain/blockchain/receive_block.go * Update beacon-chain/core/blocks/block_operations_test.go * Update beacon-chain/core/blocks/block_operations.go * Update beacon-chain/core/epoch/epoch_processing.go * Update beacon-chain/sync/validate_aggregate_proof_test.go * Update shared/testutil/block.go * Update slasher/service/data_update.go * Update tools/blocktree/main.go * Update slasher/service/service.go * Update beacon-chain/core/epoch/precompute/attestation_test.go * Update beacon-chain/core/helpers/committee_test.go * Update beacon-chain/core/state/transition_test.go * Update beacon-chain/rpc/aggregator/server_test.go * Update beacon-chain/sync/validate_aggregate_proof.go * Update beacon-chain/rpc/validator/proposer_test.go * Update beacon-chain/blockchain/forkchoice/process_attestation.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * Update slasher/db/indexed_attestations.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * Update slasher/service/data_update.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * terence feedback * terence feedback * goimports Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> Co-authored-by: Nishant Das <nish1993@hotmail.com> Co-authored-by: terence tsao <terence@prysmaticlabs.com>
77 lines
2.7 KiB
Go
77 lines
2.7 KiB
Go
package attestationutil
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
|
|
"github.com/pkg/errors"
|
|
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
|
"github.com/prysmaticlabs/go-bitfield"
|
|
"go.opencensus.io/trace"
|
|
)
|
|
|
|
// 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 ConvertToIndexed(ctx context.Context, attestation *ethpb.Attestation, committee []uint64) (*ethpb.IndexedAttestation, error) {
|
|
ctx, span := trace.StartSpan(ctx, "core.ConvertToIndexed")
|
|
defer span.End()
|
|
|
|
attIndices, err := AttestingIndices(attestation.AggregationBits, committee)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get attesting indices")
|
|
}
|
|
|
|
sort.Slice(attIndices, func(i, j int) bool {
|
|
return attIndices[i] < attIndices[j]
|
|
})
|
|
inAtt := ðpb.IndexedAttestation{
|
|
Data: attestation.Data,
|
|
Signature: attestation.Signature,
|
|
AttestingIndices: attIndices,
|
|
}
|
|
return inAtt, nil
|
|
}
|
|
|
|
// 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 AttestingIndices(bf bitfield.Bitfield, committee []uint64) ([]uint64, error) {
|
|
indices := make([]uint64, 0, len(committee))
|
|
indicesSet := make(map[uint64]bool)
|
|
for i, idx := range committee {
|
|
if !indicesSet[idx] {
|
|
if bf.BitAt(uint64(i)) {
|
|
indices = append(indices, idx)
|
|
}
|
|
}
|
|
indicesSet[idx] = true
|
|
}
|
|
return indices, nil
|
|
}
|