Remove processSlots from slashing check (#7357)

* Remove processSlots from slashing check

* imports

* imports

* PR feedback from @nisdas

Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com>
This commit is contained in:
Preston Van Loon 2020-09-28 22:22:55 -07:00 committed by GitHub
parent 6ef4995329
commit 0921c00094
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 57 additions and 35 deletions

View File

@ -86,7 +86,7 @@ func VerifyProposerSlashing(
if err != nil {
return err
}
if !helpers.IsSlashableValidatorUsingTrie(proposer, helpers.SlotToEpoch(beaconState.Slot())) {
if !helpers.IsSlashableValidatorUsingTrie(proposer, helpers.SlotToEpoch(hSlot)) {
return fmt.Errorf("validator with key %#x is not slashable", proposer.PublicKey())
}
headers := []*ethpb.SignedBeaconBlockHeader{slashing.Header_1, slashing.Header_2}

View File

@ -191,7 +191,7 @@ func TestVerifyProposerSlashing(t *testing.T) {
slashing *ethpb.ProposerSlashing
}
beaconState, _ := testutil.DeterministicGenesisState(t, 2)
beaconState, sks := testutil.DeterministicGenesisState(t, 2)
currentSlot := uint64(0)
require.NoError(t, beaconState.SetSlot(currentSlot))
@ -201,19 +201,25 @@ func TestVerifyProposerSlashing(t *testing.T) {
wantErr string
}{
{
name: "same header, no signatures",
name: "same header, same slot as state",
args: args{
slashing: &ethpb.ProposerSlashing{
Header_1: &ethpb.SignedBeaconBlockHeader{
Header: &ethpb.BeaconBlockHeader{
ProposerIndex: 1,
Slot: 0,
Slot: currentSlot,
StateRoot: bytesutil.PadTo([]byte{}, 32),
BodyRoot: bytesutil.PadTo([]byte{}, 32),
ParentRoot: bytesutil.PadTo([]byte{}, 32),
},
},
Header_2: &ethpb.SignedBeaconBlockHeader{
Header: &ethpb.BeaconBlockHeader{
ProposerIndex: 1,
Slot: 0,
Slot: currentSlot,
StateRoot: bytesutil.PadTo([]byte{}, 32),
BodyRoot: bytesutil.PadTo([]byte{}, 32),
ParentRoot: bytesutil.PadTo([]byte{}, 32),
},
},
},
@ -229,6 +235,9 @@ func TestVerifyProposerSlashing(t *testing.T) {
Header: &ethpb.BeaconBlockHeader{
ProposerIndex: 1,
Slot: 0,
StateRoot: bytesutil.PadTo([]byte{}, 32),
BodyRoot: bytesutil.PadTo([]byte{}, 32),
ParentRoot: bytesutil.PadTo([]byte{}, 32),
},
Signature: bls.RandKey().Sign([]byte("foo")).Marshal(),
},
@ -236,6 +245,9 @@ func TestVerifyProposerSlashing(t *testing.T) {
Header: &ethpb.BeaconBlockHeader{
ProposerIndex: 1,
Slot: 0,
StateRoot: bytesutil.PadTo([]byte{}, 32),
BodyRoot: bytesutil.PadTo([]byte{}, 32),
ParentRoot: bytesutil.PadTo([]byte{}, 32),
},
Signature: bls.RandKey().Sign([]byte("bar")).Marshal(),
},
@ -244,10 +256,50 @@ func TestVerifyProposerSlashing(t *testing.T) {
},
wantErr: "expected slashing headers to differ",
},
{
name: "slashing in future epoch",
args: args{
slashing: &ethpb.ProposerSlashing{
Header_1: &ethpb.SignedBeaconBlockHeader{
Header: &ethpb.BeaconBlockHeader{
ProposerIndex: 1,
Slot: 65,
StateRoot: bytesutil.PadTo([]byte{}, 32),
BodyRoot: bytesutil.PadTo([]byte{}, 32),
ParentRoot: bytesutil.PadTo([]byte("foo"), 32),
},
},
Header_2: &ethpb.SignedBeaconBlockHeader{
Header: &ethpb.BeaconBlockHeader{
ProposerIndex: 1,
Slot: 65,
StateRoot: bytesutil.PadTo([]byte{}, 32),
BodyRoot: bytesutil.PadTo([]byte{}, 32),
ParentRoot: bytesutil.PadTo([]byte("bar"), 32),
},
},
},
beaconState: beaconState,
},
wantErr: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
testutil.ResetCache()
sk := sks[tt.args.slashing.Header_1.Header.ProposerIndex]
d, err := helpers.Domain(tt.args.beaconState.Fork(), helpers.SlotToEpoch(tt.args.slashing.Header_1.Header.Slot), params.BeaconConfig().DomainBeaconProposer, tt.args.beaconState.GenesisValidatorRoot())
require.NoError(t, err)
if tt.args.slashing.Header_1.Signature == nil {
sr, err := helpers.ComputeSigningRoot(tt.args.slashing.Header_1.Header, d)
require.NoError(t, err)
tt.args.slashing.Header_1.Signature = sk.Sign(sr[:]).Marshal()
}
if tt.args.slashing.Header_2.Signature == nil {
sr, err := helpers.ComputeSigningRoot(tt.args.slashing.Header_2.Header, d)
require.NoError(t, err)
tt.args.slashing.Header_2.Signature = sk.Sign(sr[:]).Marshal()
}
if err := blocks.VerifyProposerSlashing(tt.args.beaconState, tt.args.slashing); (err != nil || tt.wantErr != "") && err.Error() != tt.wantErr {
t.Errorf("VerifyProposerSlashing() error = %v, wantErr %v", err, tt.wantErr)
}

View File

@ -8,9 +8,7 @@ import (
pubsub "github.com/libp2p/go-libp2p-pubsub"
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/beacon-chain/core/blocks"
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
"github.com/prysmaticlabs/prysm/shared/hashutil"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/sliceutil"
"github.com/prysmaticlabs/prysm/shared/traceutil"
"go.opencensus.io/trace"
@ -51,24 +49,10 @@ func (s *Service) validateAttesterSlashing(ctx context.Context, pid peer.ID, msg
return pubsub.ValidationIgnore
}
// Retrieve head state, advance state to the epoch slot used specified in slashing message.
headState, err := s.chain.HeadState(ctx)
if err != nil {
return pubsub.ValidationIgnore
}
slashSlot := slashing.Attestation_1.Data.Target.Epoch * params.BeaconConfig().SlotsPerEpoch
if headState.Slot() < slashSlot {
if ctx.Err() != nil {
return pubsub.ValidationIgnore
}
var err error
headState, err = state.ProcessSlots(ctx, headState, slashSlot)
if err != nil {
return pubsub.ValidationIgnore
}
}
if err := blocks.VerifyAttesterSlashing(ctx, headState, slashing); err != nil {
return pubsub.ValidationReject
}

View File

@ -7,7 +7,6 @@ import (
pubsub "github.com/libp2p/go-libp2p-pubsub"
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/beacon-chain/core/blocks"
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
"github.com/prysmaticlabs/prysm/shared/traceutil"
"go.opencensus.io/trace"
)
@ -48,23 +47,10 @@ func (s *Service) validateProposerSlashing(ctx context.Context, pid peer.ID, msg
return pubsub.ValidationIgnore
}
// Retrieve head state, advance state to the epoch slot used specified in slashing message.
headState, err := s.chain.HeadState(ctx)
if err != nil {
return pubsub.ValidationIgnore
}
slashSlot := slashing.Header_1.Header.Slot
if headState.Slot() < slashSlot {
if ctx.Err() != nil {
return pubsub.ValidationIgnore
}
var err error
headState, err = state.ProcessSlots(ctx, headState, slashSlot)
if err != nil {
return pubsub.ValidationIgnore
}
}
if err := blocks.VerifyProposerSlashing(headState, slashing); err != nil {
return pubsub.ValidationReject
}