prysm-pulse/testing/util/sync_aggregate.go
Raul Jordan d077483577
Add V3 Suffix to All Prysm Packages (#11083)
* v3 import renamings

* tidy

* fmt

* rev

* Update beacon-chain/core/epoch/precompute/reward_penalty_test.go

* Update beacon-chain/core/helpers/validators_test.go

* Update beacon-chain/db/alias.go

* Update beacon-chain/db/alias.go

* Update beacon-chain/db/alias.go

* Update beacon-chain/db/iface/BUILD.bazel

* Update beacon-chain/db/kv/kv.go

* Update beacon-chain/db/kv/state.go

* Update beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go

* Update beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go

* Update beacon-chain/sync/initial-sync/service.go

* fix deps

* fix bad replacements

* fix bad replacements

* change back

* gohashtree version

* fix deps

Co-authored-by: Nishant Das <nishdas93@gmail.com>
Co-authored-by: Potuz <potuz@prysmaticlabs.com>
2022-08-16 12:20:13 +00:00

74 lines
2.3 KiB
Go

package util
import (
"github.com/pkg/errors"
"github.com/prysmaticlabs/go-bitfield"
"github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing"
p2pType "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/types"
"github.com/prysmaticlabs/prysm/v3/beacon-chain/state"
"github.com/prysmaticlabs/prysm/v3/config/params"
"github.com/prysmaticlabs/prysm/v3/crypto/bls"
"github.com/prysmaticlabs/prysm/v3/encoding/bytesutil"
ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1"
"github.com/prysmaticlabs/prysm/v3/time/slots"
)
func generateSyncAggregate(st state.BeaconState, privs []bls.SecretKey, parentRoot [32]byte) (*ethpb.SyncAggregate, error) {
nextSlotEpoch := slots.ToEpoch(st.Slot() + 1)
currEpoch := slots.ToEpoch(st.Slot())
var syncCommittee *ethpb.SyncCommittee
var err error
if slots.SyncCommitteePeriod(currEpoch) == slots.SyncCommitteePeriod(nextSlotEpoch) {
syncCommittee, err = st.CurrentSyncCommittee()
if err != nil {
return nil, err
}
} else {
syncCommittee, err = st.NextSyncCommittee()
if err != nil {
return nil, err
}
}
sigs := make([]bls.Signature, 0, len(syncCommittee.Pubkeys))
var bVector []byte
currSize := new(ethpb.SyncAggregate).SyncCommitteeBits.Len()
switch currSize {
case 512:
bVector = bitfield.NewBitvector512()
case 32:
bVector = bitfield.NewBitvector32()
default:
return nil, errors.New("invalid bit vector size")
}
for i, p := range syncCommittee.Pubkeys {
idx, ok := st.ValidatorIndexByPubkey(bytesutil.ToBytes48(p))
if !ok {
continue
}
d, err := signing.Domain(st.Fork(), slots.ToEpoch(st.Slot()), params.BeaconConfig().DomainSyncCommittee, st.GenesisValidatorsRoot())
if err != nil {
return nil, err
}
sszBytes := p2pType.SSZBytes(parentRoot[:])
r, err := signing.ComputeSigningRoot(&sszBytes, d)
if err != nil {
return nil, err
}
sigs = append(sigs, privs[idx].Sign(r[:]))
if currSize == 512 {
bitfield.Bitvector512(bVector).SetBitAt(uint64(i), true)
}
if currSize == 32 {
bitfield.Bitvector32(bVector).SetBitAt(uint64(i), true)
}
}
if len(sigs) == 0 {
fakeSig := [96]byte{0xC0}
return &ethpb.SyncAggregate{SyncCommitteeSignature: fakeSig[:], SyncCommitteeBits: bVector}, nil
}
aggSig := bls.AggregateSignatures(sigs)
return &ethpb.SyncAggregate{SyncCommitteeSignature: aggSig.Marshal(), SyncCommitteeBits: bVector}, nil
}