Search in sources :

Example 1 with SszPublicKey

use of tech.pegasys.teku.spec.datastructures.type.SszPublicKey in project teku by ConsenSys.

the class SyncCommittee method asInternalSyncCommittee.

public tech.pegasys.teku.spec.datastructures.state.SyncCommittee asInternalSyncCommittee(final tech.pegasys.teku.spec.datastructures.state.SyncCommittee.SyncCommitteeSchema schema) {
    SszPublicKey aggregate = new SszPublicKey(aggregatePubkey.asBLSPublicKey());
    List<SszPublicKey> committee = pubkeys.stream().map(key -> new SszPublicKey(key.asBLSPublicKey())).collect(Collectors.toList());
    return schema.create(committee, aggregate);
}
Also used : Schema(io.swagger.v3.oas.annotations.media.Schema) JsonProperty(com.fasterxml.jackson.annotation.JsonProperty) ArraySchema(io.swagger.v3.oas.annotations.media.ArraySchema) List(java.util.List) DESCRIPTION_BYTES48(tech.pegasys.teku.api.schema.SchemaConstants.DESCRIPTION_BYTES48) JsonCreator(com.fasterxml.jackson.annotation.JsonCreator) SszPublicKey(tech.pegasys.teku.spec.datastructures.type.SszPublicKey) BLSPubKey(tech.pegasys.teku.api.schema.BLSPubKey) Collectors(java.util.stream.Collectors) SszPublicKey(tech.pegasys.teku.spec.datastructures.type.SszPublicKey)

Example 2 with SszPublicKey

use of tech.pegasys.teku.spec.datastructures.type.SszPublicKey in project teku by ConsenSys.

the class SyncCommitteeUtil method getSyncSubcommittees.

public Map<UInt64, SyncSubcommitteeAssignments> getSyncSubcommittees(final BeaconState state, final UInt64 epoch) {
    final UInt64 syncCommitteePeriod = computeSyncCommitteePeriod(epoch);
    final UInt64 currentEpoch = beaconStateAccessors.getCurrentEpoch(state);
    final UInt64 currentSyncCommitteePeriod = computeSyncCommitteePeriod(currentEpoch);
    checkArgument(isStateUsableForCommitteeCalculationAtEpoch(state, epoch), "State must be in the same or previous sync committee period. Cannot calculate epoch %s from state at slot %s", epoch, state.getSlot());
    final BeaconStateAltair altairState = BeaconStateAltair.required(state);
    return BeaconStateCache.getTransitionCaches(altairState).getSyncCommitteeCache().get(syncCommitteePeriod, period -> {
        final SyncCommittee syncCommittee;
        if (syncCommitteePeriod.equals(currentSyncCommitteePeriod)) {
            syncCommittee = altairState.getCurrentSyncCommittee();
        } else {
            syncCommittee = altairState.getNextSyncCommittee();
        }
        final int subcommitteeSize = getSubcommitteeSize();
        final SszVector<SszPublicKey> pubkeys = syncCommittee.getPubkeys();
        final Map<UInt64, SyncSubcommitteeAssignments.Builder> subcommitteeAssignments = new HashMap<>();
        for (int index = 0; index < pubkeys.size(); index++) {
            final BLSPublicKey pubkey = pubkeys.get(index).getBLSPublicKey();
            final UInt64 validatorIndex = UInt64.valueOf(validatorsUtil.getValidatorIndex(altairState, pubkey).orElseThrow(() -> new IllegalStateException("Unknown validator assigned to sync committee: " + pubkey)));
            final int subcommitteeIndex = index / subcommitteeSize;
            final int subcommitteeParticipationIndex = index - (subcommitteeIndex * subcommitteeSize);
            // Note we're using plain HashMap here instead of a concurrent alternative as they
            // are created once here and then never modified so safe to access from multiple
            // threads.
            subcommitteeAssignments.computeIfAbsent(validatorIndex, __ -> SyncSubcommitteeAssignments.builder()).addAssignment(subcommitteeIndex, subcommitteeParticipationIndex).addCommitteeIndex(index);
        }
        return subcommitteeAssignments.entrySet().stream().collect(toUnmodifiableMap(Map.Entry::getKey, entry -> entry.getValue().build()));
    });
}
Also used : BeaconBlockBodySchemaAltair(tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair.BeaconBlockBodySchemaAltair) HashMap(java.util.HashMap) SszPublicKey(tech.pegasys.teku.spec.datastructures.type.SszPublicKey) Bytes(org.apache.tuweni.bytes.Bytes) SchemaDefinitionsAltair(tech.pegasys.teku.spec.schemas.SchemaDefinitionsAltair) ContributionAndProof(tech.pegasys.teku.spec.datastructures.operations.versions.altair.ContributionAndProof) SYNC_COMMITTEE_SUBNET_COUNT(tech.pegasys.teku.spec.constants.NetworkConstants.SYNC_COMMITTEE_SUBNET_COUNT) ArrayList(java.util.ArrayList) Collectors.toUnmodifiableMap(java.util.stream.Collectors.toUnmodifiableMap) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) ValidatorConstants(tech.pegasys.teku.spec.constants.ValidatorConstants) IntIterable(it.unimi.dsi.fastutil.ints.IntIterable) Map(java.util.Map) UInt64(tech.pegasys.teku.infrastructure.unsigned.UInt64) ForkInfo(tech.pegasys.teku.spec.datastructures.state.ForkInfo) SyncCommitteeContributionSchema(tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncCommitteeContributionSchema) Bytes32(org.apache.tuweni.bytes.Bytes32) SyncAggregateSchema(tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair.SyncAggregateSchema) Domain(tech.pegasys.teku.spec.constants.Domain) SyncCommitteeContribution(tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncCommitteeContribution) BeaconStateAccessorsAltair(tech.pegasys.teku.spec.logic.versions.altair.helpers.BeaconStateAccessorsAltair) MiscHelpers(tech.pegasys.teku.spec.logic.common.helpers.MiscHelpers) BLS(tech.pegasys.teku.bls.BLS) BLSSignature(tech.pegasys.teku.bls.BLSSignature) BLSPublicKey(tech.pegasys.teku.bls.BLSPublicKey) SyncAggregatorSelectionData(tech.pegasys.teku.spec.datastructures.operations.versions.altair.SyncAggregatorSelectionData) SyncSubcommitteeAssignments(tech.pegasys.teku.spec.datastructures.util.SyncSubcommitteeAssignments) MutableBeaconStateAltair(tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.MutableBeaconStateAltair) SignedContributionAndProof(tech.pegasys.teku.spec.datastructures.operations.versions.altair.SignedContributionAndProof) Hash(tech.pegasys.teku.infrastructure.crypto.Hash) SyncCommittee(tech.pegasys.teku.spec.datastructures.state.SyncCommittee) MutableBeaconState(tech.pegasys.teku.spec.datastructures.state.beaconstate.MutableBeaconState) List(java.util.List) IntList(it.unimi.dsi.fastutil.ints.IntList) MathHelpers.bytesToUInt64(tech.pegasys.teku.spec.logic.common.helpers.MathHelpers.bytesToUInt64) IntOpenHashSet(it.unimi.dsi.fastutil.ints.IntOpenHashSet) SszVector(tech.pegasys.teku.infrastructure.ssz.SszVector) IntSet(it.unimi.dsi.fastutil.ints.IntSet) BeaconStateCache(tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconStateCache) BeaconStateAltair(tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.BeaconStateAltair) IntArrayList(it.unimi.dsi.fastutil.ints.IntArrayList) SpecConfigAltair(tech.pegasys.teku.spec.config.SpecConfigAltair) SyncAggregate(tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.altair.SyncAggregate) BeaconState(tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconState) HashMap(java.util.HashMap) SyncCommittee(tech.pegasys.teku.spec.datastructures.state.SyncCommittee) SszPublicKey(tech.pegasys.teku.spec.datastructures.type.SszPublicKey) UInt64(tech.pegasys.teku.infrastructure.unsigned.UInt64) MathHelpers.bytesToUInt64(tech.pegasys.teku.spec.logic.common.helpers.MathHelpers.bytesToUInt64) BLSPublicKey(tech.pegasys.teku.bls.BLSPublicKey) HashMap(java.util.HashMap) Collectors.toUnmodifiableMap(java.util.stream.Collectors.toUnmodifiableMap) Map(java.util.Map) MutableBeaconStateAltair(tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.MutableBeaconStateAltair) BeaconStateAltair(tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.altair.BeaconStateAltair)

Example 3 with SszPublicKey

use of tech.pegasys.teku.spec.datastructures.type.SszPublicKey in project teku by ConsenSys.

the class BeaconStateAccessorsAltair method getNextSyncCommittee.

/**
 * Return the *next* sync committee for a given state.
 *
 * <p>SyncCommittee contains an aggregate pubkey that enables resource-constrained clients to save
 * some computation when verifying the sync committee's signature.
 *
 * <p>SyncCommittee can also contain duplicate pubkeys, when {@link
 * #getNextSyncCommitteeIndices(BeaconState)} returns duplicate indices. Implementations must take
 * care when handling optimizations relating to aggregation and verification in the presence of
 * duplicates.
 *
 * <p>Note: This function should only be called at sync committee period boundaries by {@link
 * tech.pegasys.teku.spec.logic.common.statetransition.epoch.EpochProcessor#processSyncCommitteeUpdates(MutableBeaconState)}
 * as {@link #getNextSyncCommitteeIndices(BeaconState)} is not stable within a given period.
 *
 * @param state the state to get the sync committee for
 * @return the SyncCommittee
 */
public SyncCommittee getNextSyncCommittee(final BeaconState state) {
    final IntList indices = getNextSyncCommitteeIndices(state);
    final List<BLSPublicKey> pubkeys = indices.intStream().mapToObj(index -> getValidatorPubKey(state, UInt64.valueOf(index)).orElseThrow()).collect(toList());
    final BLSPublicKey aggregatePubkey = BLSPublicKey.aggregate(pubkeys);
    return state.getBeaconStateSchema().getNextSyncCommitteeSchemaOrThrow().create(pubkeys.stream().map(SszPublicKey::new).collect(toList()), new SszPublicKey(aggregatePubkey));
}
Also used : SszList(tech.pegasys.teku.infrastructure.ssz.SszList) ParticipationFlags(tech.pegasys.teku.spec.constants.ParticipationFlags) SszPublicKey(tech.pegasys.teku.spec.datastructures.type.SszPublicKey) BeaconStateAccessors(tech.pegasys.teku.spec.logic.common.helpers.BeaconStateAccessors) ArrayList(java.util.ArrayList) AttestationData(tech.pegasys.teku.spec.datastructures.operations.AttestationData) UInt64(tech.pegasys.teku.infrastructure.unsigned.UInt64) Bytes32(org.apache.tuweni.bytes.Bytes32) ByteUtil(tech.pegasys.teku.infrastructure.unsigned.ByteUtil) Domain(tech.pegasys.teku.spec.constants.Domain) Validator(tech.pegasys.teku.spec.datastructures.state.Validator) BLSPublicKey(tech.pegasys.teku.bls.BLSPublicKey) MathHelpers.integerSquareRoot(tech.pegasys.teku.spec.logic.common.helpers.MathHelpers.integerSquareRoot) Predicates(tech.pegasys.teku.spec.logic.common.helpers.Predicates) Hash(tech.pegasys.teku.infrastructure.crypto.Hash) SyncCommittee(tech.pegasys.teku.spec.datastructures.state.SyncCommittee) MutableBeaconState(tech.pegasys.teku.spec.datastructures.state.beaconstate.MutableBeaconState) Collectors.toList(java.util.stream.Collectors.toList) MathHelpers.uint64ToBytes(tech.pegasys.teku.spec.logic.common.helpers.MathHelpers.uint64ToBytes) List(java.util.List) IntList(it.unimi.dsi.fastutil.ints.IntList) BeaconStateCache(tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconStateCache) Checkpoint(tech.pegasys.teku.spec.datastructures.state.Checkpoint) IntArrayList(it.unimi.dsi.fastutil.ints.IntArrayList) SpecConfigAltair(tech.pegasys.teku.spec.config.SpecConfigAltair) BeaconState(tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconState) SszPublicKey(tech.pegasys.teku.spec.datastructures.type.SszPublicKey) BLSPublicKey(tech.pegasys.teku.bls.BLSPublicKey) IntList(it.unimi.dsi.fastutil.ints.IntList)

Example 4 with SszPublicKey

use of tech.pegasys.teku.spec.datastructures.type.SszPublicKey in project teku by ConsenSys.

the class SyncCommitteeUtilTest method getSyncSubCommittees_shouldSupportValidatorsInTheSameSubCommitteeMultipleTimes.

@Test
void getSyncSubCommittees_shouldSupportValidatorsInTheSameSubCommitteeMultipleTimes() {
    final List<SszPublicKey> syncCommittee = new ArrayList<>(validatorPublicKeys);
    final SszPublicKey validator0 = syncCommittee.get(0);
    syncCommittee.set(2, validator0);
    syncCommittee.set(3, validator0);
    final BeaconState state = createStateWithCurrentSyncCommittee(syncCommittee);
    final Map<UInt64, SyncSubcommitteeAssignments> syncSubcommittees = syncCommitteeUtil.getSyncSubcommittees(state, spec.getCurrentEpoch(state));
    final SyncSubcommitteeAssignments assignments = syncSubcommittees.get(UInt64.ZERO);
    assertThat(assignments.getAssignedSubcommittees()).containsExactly(0);
    assertThat(assignments.getParticipationBitIndices(0)).containsExactlyInAnyOrder(0, 2, 3);
}
Also used : SyncSubcommitteeAssignments(tech.pegasys.teku.spec.datastructures.util.SyncSubcommitteeAssignments) SszPublicKey(tech.pegasys.teku.spec.datastructures.type.SszPublicKey) ArrayList(java.util.ArrayList) UInt64(tech.pegasys.teku.infrastructure.unsigned.UInt64) BeaconState(tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconState) Test(org.junit.jupiter.api.Test)

Example 5 with SszPublicKey

use of tech.pegasys.teku.spec.datastructures.type.SszPublicKey in project teku by ConsenSys.

the class SyncCommitteeUtilTest method getSyncSubCommittees_shouldSupportValidatorsInMultipleSubCommittees.

@Test
void getSyncSubCommittees_shouldSupportValidatorsInMultipleSubCommittees() {
    final List<SszPublicKey> singleSubcommittee = validatorPublicKeys.subList(0, subcommitteeSize);
    final List<SszPublicKey> syncCommittee = new ArrayList<>();
    for (int i = 0; i < SYNC_COMMITTEE_SUBNET_COUNT; i++) {
        syncCommittee.addAll(singleSubcommittee);
    }
    final List<UInt64> expectedValidatorIndices = IntStream.range(0, subcommitteeSize).mapToObj(UInt64::valueOf).collect(toList());
    final BeaconState state = createStateWithCurrentSyncCommittee(syncCommittee);
    final Map<UInt64, SyncSubcommitteeAssignments> syncSubcommittees = syncCommitteeUtil.getSyncSubcommittees(state, spec.getCurrentEpoch(state));
    assertThat(syncSubcommittees).containsOnlyKeys(expectedValidatorIndices);
    expectedValidatorIndices.forEach(index -> {
        final SyncSubcommitteeAssignments assignments = syncSubcommittees.get(index);
        assertThat(assignments.getAssignedSubcommittees()).containsExactlyInAnyOrderElementsOf(IntStream.range(0, SYNC_COMMITTEE_SUBNET_COUNT).boxed().collect(toList()));
        IntStream.range(0, SYNC_COMMITTEE_SUBNET_COUNT).forEach(subcommitteeIndex -> assertThat(assignments.getParticipationBitIndices(subcommitteeIndex)).containsExactly(index.intValue()));
    });
}
Also used : SyncSubcommitteeAssignments(tech.pegasys.teku.spec.datastructures.util.SyncSubcommitteeAssignments) SszPublicKey(tech.pegasys.teku.spec.datastructures.type.SszPublicKey) ArrayList(java.util.ArrayList) UInt64(tech.pegasys.teku.infrastructure.unsigned.UInt64) BeaconState(tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconState) Test(org.junit.jupiter.api.Test)

Aggregations

SszPublicKey (tech.pegasys.teku.spec.datastructures.type.SszPublicKey)6 ArrayList (java.util.ArrayList)4 UInt64 (tech.pegasys.teku.infrastructure.unsigned.UInt64)4 BeaconState (tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconState)4 List (java.util.List)3 Test (org.junit.jupiter.api.Test)3 BLSPublicKey (tech.pegasys.teku.bls.BLSPublicKey)3 SyncSubcommitteeAssignments (tech.pegasys.teku.spec.datastructures.util.SyncSubcommitteeAssignments)3 IntArrayList (it.unimi.dsi.fastutil.ints.IntArrayList)2 IntList (it.unimi.dsi.fastutil.ints.IntList)2 Bytes32 (org.apache.tuweni.bytes.Bytes32)2 Hash (tech.pegasys.teku.infrastructure.crypto.Hash)2 SpecConfigAltair (tech.pegasys.teku.spec.config.SpecConfigAltair)2 Domain (tech.pegasys.teku.spec.constants.Domain)2 SyncCommittee (tech.pegasys.teku.spec.datastructures.state.SyncCommittee)2 BeaconStateCache (tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconStateCache)2 MutableBeaconState (tech.pegasys.teku.spec.datastructures.state.beaconstate.MutableBeaconState)2 JsonCreator (com.fasterxml.jackson.annotation.JsonCreator)1 JsonProperty (com.fasterxml.jackson.annotation.JsonProperty)1 Preconditions.checkArgument (com.google.common.base.Preconditions.checkArgument)1