mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-23 03:51:29 +00:00
Added AggregatedAttestation helper (#3539)
This commit is contained in:
parent
fb8d6a4046
commit
2b2ef4f37c
@ -21,7 +21,6 @@ go_library(
|
||||
"//beacon-chain/db/filters:go_default_library",
|
||||
"//proto/beacon/p2p/v1:go_default_library",
|
||||
"//proto/eth/v1alpha1:go_default_library",
|
||||
"//shared/bls:go_default_library",
|
||||
"//shared/bytesutil:go_default_library",
|
||||
"//shared/hashutil:go_default_library",
|
||||
"//shared/params:go_default_library",
|
||||
|
@ -14,7 +14,6 @@ import (
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
|
||||
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/shared/bls"
|
||||
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
||||
"github.com/prysmaticlabs/prysm/shared/hashutil"
|
||||
"github.com/prysmaticlabs/prysm/shared/params"
|
||||
@ -203,23 +202,12 @@ func (s *Store) aggregateAttestation(ctx context.Context, att *ethpb.Attestation
|
||||
return err
|
||||
}
|
||||
|
||||
incomingAttBits := att.AggregationBits
|
||||
if a, ok := s.attsQueue[root]; ok {
|
||||
if !a.AggregationBits.Contains(incomingAttBits) {
|
||||
newBits := a.AggregationBits.Or(incomingAttBits)
|
||||
incomingSig, err := bls.SignatureFromBytes(att.Signature)
|
||||
a, err := helpers.AggregateAttestation(a, att)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil
|
||||
}
|
||||
currentSig, err := bls.SignatureFromBytes(a.Signature)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
aggregatedSig := bls.AggregateSignatures([]*bls.Signature{currentSig, incomingSig})
|
||||
a.Signature = aggregatedSig.Marshal()
|
||||
a.AggregationBits = newBits
|
||||
s.attsQueue[root] = a
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -252,5 +252,3 @@ func (s *Store) JustifiedCheckpt() *ethpb.Checkpoint {
|
||||
func (s *Store) FinalizedCheckpt() *ethpb.Checkpoint {
|
||||
return proto.Clone(s.finalizedCheckpt).(*ethpb.Checkpoint)
|
||||
}
|
||||
|
||||
|
||||
|
@ -41,7 +41,7 @@ func (s *Service) ReceiveBlock(ctx context.Context, block *ethpb.BeaconBlock) er
|
||||
}
|
||||
log.WithFields(logrus.Fields{
|
||||
"blockRoot": hex.EncodeToString(root[:]),
|
||||
}).Info("Broadcasting block")
|
||||
}).Debug("Broadcasting block")
|
||||
|
||||
if err := s.ReceiveBlockNoPubsub(ctx, block); err != nil {
|
||||
return err
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/shared/bls"
|
||||
|
||||
"github.com/prysmaticlabs/prysm/shared/params"
|
||||
)
|
||||
@ -49,3 +50,32 @@ func AttestationDataSlot(state *pb.BeaconState, data *ethpb.AttestationData) (ui
|
||||
|
||||
return StartSlot(data.Target.Epoch) + (offset / (committeeCount / params.BeaconConfig().SlotsPerEpoch)), nil
|
||||
}
|
||||
|
||||
// AggregateAttestation aggregates attestations a1 and a2 together.
|
||||
func AggregateAttestation(a1 *ethpb.Attestation, a2 *ethpb.Attestation) (*ethpb.Attestation, error) {
|
||||
baseAtt := a1
|
||||
newAtt := a2
|
||||
if a2.AggregationBits.Count() > a1.AggregationBits.Count() {
|
||||
baseAtt = a2
|
||||
newAtt = a1
|
||||
}
|
||||
if baseAtt.AggregationBits.Contains(newAtt.AggregationBits) {
|
||||
return baseAtt, nil
|
||||
}
|
||||
|
||||
newBits := baseAtt.AggregationBits.Or(newAtt.AggregationBits)
|
||||
newSig, err := bls.SignatureFromBytes(newAtt.Signature)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
baseSig, err := bls.SignatureFromBytes(baseAtt.Signature)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
aggregatedSig := bls.AggregateSignatures([]*bls.Signature{baseSig, newSig})
|
||||
baseAtt.Signature = aggregatedSig.Marshal()
|
||||
baseAtt.AggregationBits = newBits
|
||||
|
||||
return baseAtt, nil
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
package helpers_test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/prysmaticlabs/go-bitfield"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
|
||||
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
||||
@ -84,3 +86,30 @@ func TestAttestationDataSlot_ReturnsErrorWhenTargetEpochLessThanCurrentEpoch(t *
|
||||
t.Logf("attestation slot=%v", s)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAggregateAttestation(t *testing.T) {
|
||||
tests := []struct {
|
||||
a1 *ethpb.Attestation
|
||||
a2 *ethpb.Attestation
|
||||
want *ethpb.Attestation
|
||||
}{
|
||||
{a1: ðpb.Attestation{AggregationBits: []byte{}},
|
||||
a2: ðpb.Attestation{AggregationBits: []byte{}},
|
||||
want: ðpb.Attestation{AggregationBits: []byte{}}},
|
||||
{a1: ðpb.Attestation{AggregationBits: bitfield.Bitlist{0x02}},
|
||||
a2: ðpb.Attestation{AggregationBits: bitfield.Bitlist{0x03}},
|
||||
want: ðpb.Attestation{AggregationBits: []byte{0x03}}},
|
||||
{a1: ðpb.Attestation{AggregationBits: bitfield.Bitlist{0x03}},
|
||||
a2: ðpb.Attestation{AggregationBits: bitfield.Bitlist{0x02}},
|
||||
want: ðpb.Attestation{AggregationBits: []byte{0x03}}},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
got, err := helpers.AggregateAttestation(tt.a1, tt.a2)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("AggregateAttestation() = %v, want %v", got, tt.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,10 +7,10 @@ go_library(
|
||||
visibility = ["//beacon-chain:__subpackages__"],
|
||||
deps = [
|
||||
"//beacon-chain/core/blocks:go_default_library",
|
||||
"//beacon-chain/core/helpers:go_default_library",
|
||||
"//beacon-chain/core/state:go_default_library",
|
||||
"//beacon-chain/db:go_default_library",
|
||||
"//proto/eth/v1alpha1:go_default_library",
|
||||
"//shared/bls:go_default_library",
|
||||
"//shared/event:go_default_library",
|
||||
"//shared/hashutil:go_default_library",
|
||||
"//shared/messagehandler:go_default_library",
|
||||
|
@ -13,10 +13,10 @@ import (
|
||||
"github.com/pkg/errors"
|
||||
"github.com/prysmaticlabs/go-ssz"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/blocks"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
|
||||
"github.com/prysmaticlabs/prysm/beacon-chain/db"
|
||||
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
|
||||
"github.com/prysmaticlabs/prysm/shared/bls"
|
||||
"github.com/prysmaticlabs/prysm/shared/event"
|
||||
"github.com/prysmaticlabs/prysm/shared/hashutil"
|
||||
handler "github.com/prysmaticlabs/prysm/shared/messagehandler"
|
||||
@ -214,32 +214,18 @@ func (s *Service) HandleAttestation(ctx context.Context, message proto.Message)
|
||||
}
|
||||
}
|
||||
|
||||
incomingAttBits := attestation.AggregationBits
|
||||
if s.beaconDB.HasAttestation(ctx, root) {
|
||||
dbAtt, err := s.beaconDB.Attestation(ctx, root)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !dbAtt.AggregationBits.Contains(incomingAttBits) {
|
||||
newAggregationBits := dbAtt.AggregationBits.Or(incomingAttBits)
|
||||
incomingAttSig, err := bls.SignatureFromBytes(attestation.Signature)
|
||||
attestation, err = helpers.AggregateAttestation(dbAtt, attestation)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
dbSig, err := bls.SignatureFromBytes(dbAtt.Signature)
|
||||
if err != nil {
|
||||
if err := s.beaconDB.SaveAttestation(ctx, attestation); err != nil {
|
||||
return err
|
||||
}
|
||||
aggregatedSig := bls.AggregateSignatures([]*bls.Signature{dbSig, incomingAttSig})
|
||||
dbAtt.Signature = aggregatedSig.Marshal()
|
||||
dbAtt.AggregationBits = newAggregationBits
|
||||
if err := s.beaconDB.SaveAttestation(ctx, dbAtt); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
if err := s.beaconDB.SaveAttestation(ctx, attestation); err != nil {
|
||||
return err
|
||||
|
Loading…
Reference in New Issue
Block a user